public bool IsInst(object obj) { if (obj is CLRSharp.CLRSharp_Instance) { CLRSharp.CLRSharp_Instance ins = obj as CLRSharp_Instance; if (ins.type == this) { return(true); } //这里还要实现继承关系 } return(false); }
private void Form1_Load(object sender, EventArgs e) { //创建CLRSharp环境 env = new CLRSharp.CLRSharp_Environment(this); //加载L#模块 var dll = System.IO.File.ReadAllBytes("testdll01.dll"); var pdb = System.IO.File.ReadAllBytes("testdll01.pdb"); System.IO.MemoryStream msDll = new System.IO.MemoryStream(dll); System.IO.MemoryStream msPdb = new System.IO.MemoryStream(pdb); //env.LoadModule (msDll, null);//不需要pdb的话,第二个参数传null env.LoadModule(msDll, msPdb); Log("LoadModule HotFixCode.dll done."); //step01建立一个线程上下文,用来模拟L#的线程模型,每个线程创建一个即可。 CLRSharp.ThreadContext context = new CLRSharp.ThreadContext(env); Log("Create ThreadContext for L#."); //step02取得想要调用的L#类型 CLRSharp.ICLRType wantType = env.GetType("HoxFixCode.TestClass", null);//用全名称,包括命名空间 Log("GetType:" + wantType.Name); //和反射代码中的Type.GetType相对应 //step03 静态调用 //得到类型上的一个函数,第一个参数是函数名字,第二个参数是函数的参数表,这是一个没有参数的函数 CLRSharp.IMethod method01 = wantType.GetMethod("Test1", CLRSharp.MethodParamList.MakeEmpty()); method01.Invoke(context, null, null);//第三个参数是object[] 参数表,这个例子不需要参数 //这是个静态函数调用,对应到代码他就是HotFixCode.TestClass.Test1(); //step04 成员调用 //第二个测试程序是一个成员变量,所以先要创建实例 CLRSharp.CLRSharp_Instance typeObj = new CLRSharp.CLRSharp_Instance(wantType as CLRSharp.ICLRType_Sharp); //创建实例 CLRSharp.IMethod methodctor = wantType.GetMethod(".ctor", CLRSharp.MethodParamList.MakeEmpty()); //取得构造函数 methodctor.Invoke(context, typeObj, null); //执行构造函数 //这几行的作用对应到代码就约等于 HotFixCode.TestClass typeObj =new HotFixCode.TestClass(); CLRSharp.IMethod method02 = wantType.GetMethod("Test2", CLRSharp.MethodParamList.MakeEmpty()); method02.Invoke(context, typeObj, null); //这两行的作用就相当于 typeOBj.Test2(); }
public static MyJson.JsonNode_Object ToJson(object ScriptObject) { CLRSharp.CLRSharp_Instance sobj = ScriptObject as CLRSharp.CLRSharp_Instance; if (sobj == null) { return(null); } MyJson.JsonNode_Object obj = new MyJson.JsonNode_Object(); var stype = sobj.type; // CSLE.SType stype=sobj.type; var ms = stype.GetFieldNames(); foreach (var m in ms) { var field = stype.GetField(m); if (field.isStatic) { continue; } if ((Type)field.FieldType.TypeForSystem == typeof(int)) { obj[m] = new MyJson.JsonNode_ValueNumber((int)sobj.Fields[m]); } else if ((Type)field.FieldType.TypeForSystem == typeof(float)) { obj[m] = new MyJson.JsonNode_ValueNumber((float)sobj.Fields[m]); } else if ((Type)field.FieldType.TypeForSystem == typeof(double)) { obj[m] = new MyJson.JsonNode_ValueNumber((double)sobj.Fields[m]); } else if ((Type)field.FieldType.TypeForSystem == typeof(string)) { obj[m] = new MyJson.JsonNode_ValueString((string)sobj.Fields[m]); } // else if ((Type)m.Value.type.type == typeof(List<object>)) else if ((Type)field.FieldType.TypeForSystem == typeof(List <CLRSharp.CLRSharp_Instance>)) { //处理List List <CLRSharp.CLRSharp_Instance> slist = sobj.Fields[m] as List <CLRSharp.CLRSharp_Instance>; var list = new MyJson.JsonNode_Array(); obj[m] = list; foreach (var item in slist) { list.Add(ToJson(item)); } } else if ((Type)field.FieldType.TypeForSystem == typeof(List <string>)) { var list = new MyJson.JsonNode_Array(); obj[m] = list; List <string> slist = sobj.Fields[m] as List <string>; foreach (var item in slist) { list.Add(new MyJson.JsonNode_ValueString(item)); } } else if ((Type)field.FieldType.TypeForSystem == typeof(List <int>)) { var list = new MyJson.JsonNode_Array(); obj[m] = list; List <int> slist = sobj.Fields[m] as List <int>; foreach (var item in slist) { list.Add(new MyJson.JsonNode_ValueNumber(item)); } } else if ((Type)field.FieldType.TypeForSystem == typeof(List <float>)) { var list = new MyJson.JsonNode_Array(); obj[m] = list; List <float> slist = sobj.Fields[m] as List <float>; foreach (var item in slist) { list.Add(new MyJson.JsonNode_ValueNumber(item)); } } else if ((Type)field.FieldType.TypeForSystem == typeof(List <double>)) { var list = new MyJson.JsonNode_Array(); obj[m] = list; List <double> slist = sobj.Fields[m] as List <double>; foreach (var item in slist) { list.Add(new MyJson.JsonNode_ValueNumber(item)); } } else if (field.FieldType is CLRSharp.ICLRType_Sharp) // else if ((CSLE.SType)m.Value.type.type != null)//其他嵌套脚本类型 { obj[m] = ToJson(sobj.Fields[m]); } else { Logger.Log("发现不能处理的类型:" + stype.Name + ":" + m + ":" + field.FieldType.ToString()); } } return(obj); }
public static object FromJson(object ScriptType, MyJson.JsonNode_Object data) { CLRSharp.ICLRType_Sharp type = ScriptType as CLRSharp.ICLRType_Sharp; CLRSharp.CLRSharp_Instance s = new CLRSharp.CLRSharp_Instance(type); type.GetMethod(".ctor", CLRSharp.MethodParamList.constEmpty()).Invoke(null, s, new object[] { }); foreach (var m in type.GetFieldNames()) { var field = type.GetField(m); if (field.isStatic) { continue; } //s.Fields[m] = field.DefValue; // s.member[m.Key] = new CSLE.CLS_Content.Value(); // s.member[m.Key].type = m.Value.type.type; // s.member[m.Key].value = m.Value.type.DefValue;//先填默认值 if (data.ContainsKey(m) == false)//json中没有的部分填默认值 { continue; } if (data[m].IsNull())//json中没有的部分填默认值 { continue; } { if ((Type)field.FieldType.TypeForSystem == typeof(int)) { s.Fields[m] = data[m].AsInt(); } else if ((Type)field.FieldType.TypeForSystem == typeof(float)) { s.Fields[m] = (float)data[m].AsDouble(); } else if ((Type)field.FieldType.TypeForSystem == typeof(double)) { s.Fields[m] = data[m].AsDouble(); } else if ((Type)field.FieldType.TypeForSystem == typeof(string)) { s.Fields[m] = data[m].AsString(); } else if ((Type)field.FieldType.TypeForSystem == typeof(List <CLRSharp.CLRSharp_Instance>)) { //处理List List <CLRSharp.CLRSharp_Instance> list = new List <CLRSharp.CLRSharp_Instance>(); s.Fields[m] = list; var subtype = field.FieldType.SubTypes[0]; foreach (MyJson.JsonNode_Object item in data[m].AsList()) { list.Add(FromJson(subtype, item) as CLRSharp.CLRSharp_Instance); } } else if ((Type)field.FieldType.TypeForSystem == typeof(List <string>)) { List <string> list = new List <string>(); s.Fields[m] = list; foreach (MyJson.JsonNode_ValueString item in data[m].AsList()) { list.Add(item); } } else if ((Type)field.FieldType.TypeForSystem == typeof(List <int>)) { List <int> list = new List <int>(); s.Fields[m] = list; foreach (MyJson.JsonNode_ValueNumber item in data[m].AsList()) { list.Add(item); } } else if ((Type)field.FieldType.TypeForSystem == typeof(List <float>)) { List <float> list = new List <float>(); s.Fields[m] = list; foreach (MyJson.JsonNode_ValueNumber item in data[m].AsList()) { list.Add(item); } } else if ((Type)field.FieldType.TypeForSystem == typeof(List <double>)) { List <double> list = new List <double>(); s.Fields[m] = list; foreach (MyJson.JsonNode_ValueNumber item in data[m].AsList()) { list.Add(item); } } else if (field.FieldType.TypeForSystem == typeof(CLRSharp.CLRSharp_Instance))//其他嵌套脚本类型 { s.Fields[m] = FromJson(field.FieldType, data[m] as MyJson.JsonNode_Object); } else { Logger.Log("发现不能处理的类型:" + type + ":" + m + ":" + type.GetField(m).FieldType); } } } return(s); }
public static object FromJson(object ScriptType, MyJson.JsonNode_Object data) { CLRSharp.ICLRType_Sharp type = ScriptType as CLRSharp.ICLRType_Sharp; CLRSharp.CLRSharp_Instance s = new CLRSharp.CLRSharp_Instance(type); type.GetMethod(".ctor", CLRSharp.MethodParamList.constEmpty()).Invoke(null, s, new object[] { }); foreach (var m in type.GetFieldNames()) { var field = type.GetField(m); if (field.isStatic) continue; //s.Fields[m] = field.DefValue; // s.member[m.Key] = new CSLE.CLS_Content.Value(); // s.member[m.Key].type = m.Value.type.type; // s.member[m.Key].value = m.Value.type.DefValue;//先填默认值 if (data.ContainsKey(m) == false)//json中没有的部分填默认值 continue; if (data[m].IsNull())//json中没有的部分填默认值 continue; { if ((Type)field.FieldType.TypeForSystem == typeof(int)) { s.Fields[m] = data[m].AsInt(); } else if ((Type)field.FieldType.TypeForSystem == typeof(float)) { s.Fields[m] = (float)data[m].AsDouble(); } else if ((Type)field.FieldType.TypeForSystem == typeof(double)) { s.Fields[m] = data[m].AsDouble(); } else if ((Type)field.FieldType.TypeForSystem == typeof(string)) { s.Fields[m] = data[m].AsString(); } else if ((Type)field.FieldType.TypeForSystem == typeof(List<CLRSharp.CLRSharp_Instance>)) { //处理List List<CLRSharp.CLRSharp_Instance> list = new List<CLRSharp.CLRSharp_Instance>(); s.Fields[m] = list; var subtype = field.FieldType.SubTypes[0]; foreach (MyJson.JsonNode_Object item in data[m].AsList()) { list.Add(FromJson(subtype, item) as CLRSharp.CLRSharp_Instance); } } else if ((Type)field.FieldType.TypeForSystem == typeof(List<string>)) { List<string> list = new List<string>(); s.Fields[m] = list; foreach (MyJson.JsonNode_ValueString item in data[m].AsList()) { list.Add(item); } } else if ((Type)field.FieldType.TypeForSystem == typeof(List<int>)) { List<int> list = new List<int>(); s.Fields[m] = list; foreach (MyJson.JsonNode_ValueNumber item in data[m].AsList()) { list.Add(item); } } else if ((Type)field.FieldType.TypeForSystem == typeof(List<float>)) { List<float> list = new List<float>(); s.Fields[m] = list; foreach (MyJson.JsonNode_ValueNumber item in data[m].AsList()) { list.Add(item); } } else if ((Type)field.FieldType.TypeForSystem == typeof(List<double>)) { List<double> list = new List<double>(); s.Fields[m] = list; foreach (MyJson.JsonNode_ValueNumber item in data[m].AsList()) { list.Add(item); } } else if (field.FieldType.TypeForSystem == typeof(CLRSharp.CLRSharp_Instance))//其他嵌套脚本类型 { s.Fields[m] = FromJson(field.FieldType, data[m] as MyJson.JsonNode_Object); } else { Logger.Log("发现不能处理的类型:" + type + ":" + m + ":" + type.GetField(m).FieldType); } } } return s; }