Пример #1
0
 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);
 }
Пример #2
0
        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();
        }
Пример #3
0
        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);
        }
Пример #4
0
        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);
        }
Пример #5
0
        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;
        }