Init.cs 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. using System;
  2. using Base;
  3. using UnityEngine;
  4. public class Init : MonoBehaviour
  5. {
  6. CLRSharp.CLRSharp_Environment env;
  7. void Start()
  8. {
  9. //创建CLRSharp环境
  10. env = new CLRSharp.CLRSharp_Environment(new LSharpLogger());
  11. //加载L#模块
  12. GameObject code = (GameObject)Resources.Load("Code/Code");
  13. byte[] assBytes = code.Get<TextAsset>("Controller.dll").bytes;
  14. byte[] mdbBytes = code.Get<TextAsset>("Controller.dll.mdb").bytes;
  15. System.IO.MemoryStream msDll = new System.IO.MemoryStream(assBytes);
  16. System.IO.MemoryStream msMdb = new System.IO.MemoryStream(mdbBytes);
  17. //env.LoadModule (msDll);//如果无符号是pdb的话,第二个参数传null
  18. //env.LoadModule(msDll, msPdb, new Mono.Cecil.Pdb.PdbReaderProvider());//Pdb
  19. env.LoadModule(msDll, msMdb, new Mono.Cecil.Mdb.MdbReaderProvider());//如果符号是Mdb格式
  20. //step01建立一个线程上下文,用来模拟L#的线程模型,每个线程创建一个即可。
  21. CLRSharp.ThreadContext context = new CLRSharp.ThreadContext(env);
  22. //step02取得想要调用的L#类型
  23. CLRSharp.ICLRType wantType = env.GetType("Controller.Entry");//用全名称,包括命名空间
  24. //和反射代码中的Type.GetType相对应
  25. //step03 静态调用
  26. //得到类型上的一个函数,第一个参数是函数名字,第二个参数是函数的参数表,这是一个没有参数的函数
  27. CLRSharp.IMethod method01 = wantType.GetMethod("Init", CLRSharp.MethodParamList.constEmpty());
  28. method01.Invoke(context, null, null);//第三个参数是object[] 参数表,这个例子不需要参数
  29. //这是个静态函数调用,对应到代码他就是HotFixCode.TestClass.Test1();
  30. ////step04 成员调用
  31. ////第二个测试程序是一个成员变量,所以先要创建实例
  32. //CLRSharp.IMethod methodctor = wantType.GetMethod(".ctor", CLRSharp.MethodParamList.constEmpty());//取得构造函数
  33. //object typeObj = methodctor.Invoke(context, null, null);//执行构造函数
  34. ////这几行的作用对应到代码就约等于 HotFixCode.TestClass typeObj =new HotFixCode.TestClass();
  35. //CLRSharp.IMethod method02 = wantType.GetMethod("Test2", CLRSharp.MethodParamList.constEmpty());
  36. //method02.Invoke(context, typeObj, null);
  37. ////这两行的作用就相当于 typeOBj.Test2();
  38. //
  39. //var list = CLRSharp.MethodParamList.Make(env.GetType(typeof(int)), env.GetType(typeof(string)));
  40. //CLRSharp.IMethod method03 = wantType.GetMethod("Test2", list);
  41. //method03.Invoke(context, typeObj, new object[] { 1234, "abcddd" });
  42. ////这两行的作用就相当于 typeOBj.Test2(1234,"abcddd");
  43. }
  44. }