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); } }
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); } } } }
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); })); }); }