Example #1
0
        private void OnBtnLoad(object sender, EventArgs e)
        {
            if (txtPath.Text == "")
            {
                if (OD.ShowDialog() == DialogResult.OK)
                {
                    Properties.Settings.Default["assembly_path"] = txtPath.Text = OD.FileName;
                    Properties.Settings.Default.Save();
                }
                else
                {
                    return;
                }
            }

            try
            {
                using (FileStream fs = new FileStream(txtPath.Text, FileMode.Open, FileAccess.Read))
                {
                    var path    = Path.GetDirectoryName(txtPath.Text);
                    var name    = Path.GetFileNameWithoutExtension(txtPath.Text);
                    var pdbPath = Path.Combine(path, name) + ".pdb";
                    if (!File.Exists(pdbPath))
                    {
                        name    = Path.GetFileName(txtPath.Text);
                        pdbPath = Path.Combine(path, name) + ".mdb";
                    }

                    using (var fs2 = new System.IO.FileStream(pdbPath, FileMode.Open))
                    {
                        Mono.Cecil.Cil.ISymbolReaderProvider symbolReaderProvider = null;
                        if (pdbPath.EndsWith(".pdb"))
                        {
                            symbolReaderProvider = new Mono.Cecil.Pdb.PdbReaderProvider();
                        }
                        else if (pdbPath.EndsWith(".mdb"))
                        {
                            symbolReaderProvider = new Mono.Cecil.Mdb.MdbReaderProvider();
                        }

                        _app.LoadAssembly(fs, fs2, symbolReaderProvider);
                        _isLoadAssembly = true;
                    }

                    ILRuntimeHelper.Init(_app);
                    ILRuntime.Runtime.Generated.CLRBindings.Initialize(_app);

                    LoadTest();
                    UpdateBtnState();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("[Error:]" + ex);
            }
        }
Example #2
0
        public void LoadModule(System.IO.Stream dllStream, System.IO.Stream pdbStream, Mono.Cecil.Cil.ISymbolReaderProvider debugInfoLoader)
        {
            var module = Mono.Cecil.ModuleDefinition.ReadModule(dllStream);

            if (debugInfoLoader != null && pdbStream != null)
            {
                module.ReadSymbols(debugInfoLoader.GetSymbolReader(module, pdbStream));
            }
            //mapModule[module.Name] = module;
            if (module.HasTypes)
            {
                foreach (var t in module.Types)
                {
                    mapType[t.FullName] = new Type_Common_CLRSharp(this, t);
                }
            }
            if (module.HasAssemblyReferences)
            {
                foreach (var ar in module.AssemblyReferences)
                {
                    if (moduleref.Contains(ar.Name) == false)
                    {
                        moduleref.Add(ar.Name);
                    }
                }
            }
        }
Example #3
0
        public void LoadModule(System.IO.Stream dllStream, System.IO.Stream pdbStream, Mono.Cecil.Cil.ISymbolReaderProvider debugInfoLoader)
        {
            var module = Mono.Cecil.ModuleDefinition.ReadModule(dllStream);

            if (debugInfoLoader != null && pdbStream != null)
            {
                module.ReadSymbols(debugInfoLoader.GetSymbolReader(module, pdbStream));
            }
            if (module.HasAssemblyReferences)
            {
                {
                    // foreach(var ar in module.AssemblyReferences)
                    var __enumerator1 = (module.AssemblyReferences).GetEnumerator();
                    while (__enumerator1.MoveNext())
                    {
                        var ar = __enumerator1.Current;
                        {
                            if (moduleref.Contains(ar.Name) == false)
                            {
                                moduleref.Add(ar.Name);
                            }
                            if (moduleref.Contains(ar.FullName) == false)
                            {
                                moduleref.Add(ar.FullName);
                            }
                        }
                    }
                }
            }
            //mapModule[module.Name] = module;
            if (module.HasTypes)
            {
                {
                    // foreach(var t in module.Types)
                    var __enumerator2 = (module.Types).GetEnumerator();
                    while (__enumerator2.MoveNext())
                    {
                        var t = __enumerator2.Current;
                        {
                            mapType[t.FullName] = new Type_Common_CLRSharp(this, t);
                        }
                    }
                }
            }
        }
    /// <summary>
    ///
    /// </summary>
    /// <param name="dllBytes">dll 二进制数据</param>
    /// <param name="pdbBytes">pdb调试文件二进制数据,正式环境设置为null</param>
    ///
    public void Init(byte[] dllBytes, byte[] pdbBytes = null)
    {
        //首先实例化ILRuntime的AppDomain,AppDomain是一个应用程序域,每个AppDomain都是一个独立的沙盒
        appDomain = new ILRuntime.Runtime.Enviorment.AppDomain();
#if ILRuntime_DEBUG
        //是否启动调试
        appDomain.DebugService.StartDebugService(56000);
        appDomain.UnityMainThreadID = System.Threading.Thread.CurrentThread.ManagedThreadId;
#endif
        System.IO.MemoryStream dllFs = new MemoryStream(dllBytes);
        Mono.Cecil.Cil.ISymbolReaderProvider symbolReaderProvider = null;
        if (pdbBytes == null)
        {
            appDomain.LoadAssembly(dllFs, null, symbolReaderProvider);
        }
        else
        {
            System.IO.MemoryStream pdbFs = new MemoryStream(pdbBytes);
            symbolReaderProvider = new Mono.Cecil.Pdb.PdbReaderProvider();
            appDomain.LoadAssembly(dllFs, pdbFs, symbolReaderProvider);
        }
        //这里做一些ILRuntime的注册

        //使用Couroutine时,C#编译器会自动生成一个实现了IEnumerator,IEnumerator<object>,IDisposable接口的类,因为这是跨域继承,所以需要写CrossBindAdapter(详细请看04_Inheritance教程),Demo已经直接写好,直接注册即可
        //协程注册
        appDomain.RegisterCrossBindingAdaptor(new CoroutineAdapter());
        appDomain.RegisterCrossBindingAdaptor(new IGameHotFixInterfaceAdapter());

        //各种委托参数注册
        appDomain.DelegateManager.RegisterMethodDelegate <int>();
        appDomain.DelegateManager.RegisterMethodDelegate <GameObject>();
        appDomain.DelegateManager.RegisterMethodDelegate <GameObject, PointerEventData>();
        appDomain.DelegateManager.RegisterMethodDelegate <System.Object>();


        //UnityAction委托注册(ILRuntime必须转换为C#的事件委托)
        appDomain.DelegateManager.RegisterDelegateConvertor <UnityEngine.Events.UnityAction>((act) =>
        {
            return(new UnityEngine.Events.UnityAction(() =>
            {
                ((System.Action)act)();
            }));
        });

        //EventTriggerHandler封装的委托注册
        appDomain.DelegateManager.RegisterDelegateConvertor <EventTriggerListener.VoidDelegate>((act) =>
        {
            return(new EventTriggerListener.VoidDelegate((go) =>
            {
                ((System.Action <GameObject>)act)(go);
            }));
        });
        //EventTriggerHandler封装的委托注册
        appDomain.DelegateManager.RegisterDelegateConvertor <EventTriggerListener.VoidDragDelegate>((act) =>
        {
            return(new EventTriggerListener.VoidDragDelegate((go, dt) =>
            {
                ((System.Action <GameObject, PointerEventData>)act)(go, dt);
            }));
        });
    }