LSharpInit.cs 2.7 KB

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