/// <summary> /// 加载热更的动态库文件 /// </summary> private void LoadHotfixAssembly() { // TODO:正式发布时去掉PDB,下面LoadAssembly的PDB参数设置为null TextAsset dllAsset = Resources.Load <TextAsset>($"Assembly/{ILRDefine.StrMyHotfixDLLFileName}"); TextAsset pdbAsset = Resources.Load <TextAsset>($"Assembly/{ILRDefine.StrMyHotfixPDBFileName}"); if (EnableILRuntime) { LogSystem.Log(ELogType.Log, "ILRuntime模式"); var symbolReader = new Mono.Cecil.Pdb.PdbReaderProvider(); if (dllAsset != null) { _dllStream = new MemoryStream(dllAsset.bytes); } if (pdbAsset != null) { _pdbStream = new MemoryStream(pdbAsset.bytes); } ILRDomain = new ILRuntime.Runtime.Enviorment.AppDomain(); ILRDomain.LoadAssembly(_dllStream, _pdbStream, symbolReader); } else { LogSystem.Log(ELogType.Log, "Mono模式"); _monoAssembly = Assembly.Load(dllAsset.bytes, pdbAsset.bytes); } }
public void LoadModule(System.IO.Stream dllStream, System.IO.Stream pdbStream) { this.module = Mono.Cecil.ModuleDefinition.ReadModule(dllStream); #if WITHPDB if (pdbStream != null) { var debugInfoLoader = new Mono.Cecil.Pdb.PdbReaderProvider(); module.ReadSymbols(debugInfoLoader.GetSymbolReader(module, pdbStream)); } #endif if (module.HasAssemblyReferences) { foreach (var ar in module.AssemblyReferences) { 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) { mapType[t.FullName] = new ILType(this, t); } } }
static void Main(string[] args) { try { var path = args.Length >= 1 ? args[0] : "Ibasa.dll"; var symbolReader = new Mono.Cecil.Pdb.PdbReaderProvider(); var readerParameters = new ReaderParameters() { SymbolReaderProvider = symbolReader, ReadSymbols = true, }; var writerParameters = new WriterParameters() { WriteSymbols = true, }; AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly(path, readerParameters); Console.WriteLine("Loaded {0}.", path); GenerateMemoryType(assembly.MainModule); Console.WriteLine("Saving new dll."); assembly.Write(path, writerParameters); } catch (Exception e) { Console.WriteLine("InteropBuilder failed with: {0}", e); } }
static void Main(string[] args) { try { var path = args.Length >= 1 ? args[0] : "Ibasa.dll"; var symbolReader = new Mono.Cecil.Pdb.PdbReaderProvider(); var readerParameters = new ReaderParameters() { SymbolReaderProvider = symbolReader, ReadSymbols = true, }; var writerParameters = new WriterParameters() { WriteSymbols = true, }; AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly(path, readerParameters); Console.WriteLine("Loaded {0}.", path); GenerateMemoryType(assembly.MainModule); Console.WriteLine("Saving new dll."); assembly.Write(path, writerParameters); } catch (Exception e) { Console.WriteLine("InteropBuilder failed with: {0}", e); } }
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, string dir, System.IO.Stream pdbStream) { Mono.Cecil.DefaultAssemblyResolver resolver = new Mono.Cecil.DefaultAssemblyResolver(); Mono.Cecil.ReaderParameters p = new Mono.Cecil.ReaderParameters(); p.AssemblyResolver = resolver; resolver.AddSearchDirectory(dir); this.module = Mono.Cecil.ModuleDefinition.ReadModule(dllStream, p); #if WITHPDB if (pdbStream != null) { var debugInfoLoader = new Mono.Cecil.Pdb.PdbReaderProvider(); module.ReadSymbols(debugInfoLoader.GetSymbolReader(module, pdbStream)); } #endif if (module.HasAssemblyReferences) { foreach (var ar in module.AssemblyReferences) { 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) { if (t.FullName.Contains(".My."))//vb 系统类不要 { continue; } mapType[t.FullName] = new ILType(this, t); if (t.HasNestedTypes) { foreach (var nt in t.NestedTypes) { mapType[nt.FullName] = new ILType(this, nt); } } } } }
public void LoadModule(System.IO.Stream dllStream, System.IO.Stream pdbStream) { this.module = Mono.Cecil.ModuleDefinition.ReadModule(dllStream); if (pdbStream != null) { var debugInfoLoader = new Mono.Cecil.Pdb.PdbReaderProvider(); module.ReadSymbols(debugInfoLoader.GetSymbolReader(module, pdbStream)); } if (module.HasAssemblyReferences) { foreach (var ar in module.AssemblyReferences) { 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) { if (t.FullName.Contains(".My."))//vb skip the system class { continue; } mapType[t.FullName] = new ILType(this, t, logger); if (t.HasNestedTypes) { foreach (var nt in t.NestedTypes) { mapType[nt.FullName] = new ILType(this, nt, logger); } } } } }
void Rewrite(string file, string keyfile, IEnumerable <string> options) { // Specify assembly read and write parameters // We want to keep a valid symbols file (pdb or mdb) var read_params = new ReaderParameters(); var write_params = new WriterParameters(); var pdb = Path.ChangeExtension(file, "pdb"); var mdb = Path.ChangeExtension(file, "mdb"); ISymbolReaderProvider provider = null; if (File.Exists(pdb)) { provider = new Mono.Cecil.Pdb.PdbReaderProvider(); } else if (File.Exists(mdb)) { provider = new Mono.Cecil.Mdb.MdbReaderProvider(); } read_params.SymbolReaderProvider = provider; read_params.ReadSymbols = true; write_params.WriteSymbols = true; if (!String.IsNullOrEmpty(keyfile) && File.Exists(keyfile)) { keyfile = Path.GetFullPath(keyfile); var fs = new FileStream(keyfile, FileMode.Open); var keypair = new System.Reflection.StrongNameKeyPair(fs); fs.Close(); write_params.StrongNameKeyPair = keypair; } else { Console.Error.WriteLine("No keyfile specified or keyfile missing."); } // Load assembly and process all modules var assembly = AssemblyDefinition.ReadAssembly(file, read_params); var rewritten = assembly.CustomAttributes.FirstOrDefault(a => a.AttributeType.Name == "RewrittenAttribute"); if (rewritten == null) { foreach (var module in assembly.Modules) { foreach (var reference in module.AssemblyReferences) { var resolved = module.AssemblyResolver.Resolve(reference); if (reference.Name == "mscorlib") { mscorlib = resolved; } } } if (mscorlib == null) { Console.Error.WriteLine("Failed to locate mscorlib"); return; } TypeMarshal = mscorlib.MainModule.GetType("System.Runtime.InteropServices.Marshal"); TypeStringBuilder = mscorlib.MainModule.GetType("System.Text.StringBuilder"); TypeVoid = mscorlib.MainModule.GetType("System.Void"); TypeIntPtr = mscorlib.MainModule.GetType("System.IntPtr"); TypeInt32 = mscorlib.MainModule.GetType("System.Int32"); TypeBindingsBase = assembly.Modules.Select(m => m.GetType("OpenTK.BindingsBase")).First(); foreach (var module in assembly.Modules) { foreach (var type in module.Types) { Rewrite(type, options); } } } else { Console.Error.WriteLine("Error: assembly has already been rewritten"); } // Save rewritten assembly assembly.Write(file, write_params); }
void Rewrite(string file, string keyfile, IEnumerable<string> options) { // Specify assembly read and write parameters // We want to keep a valid symbols file (pdb or mdb) var read_params = new ReaderParameters(); var write_params = new WriterParameters(); var pdb = Path.ChangeExtension(file, "pdb"); var mdb = Path.ChangeExtension(file, "mdb"); ISymbolReaderProvider provider = null; if (File.Exists(pdb)) { provider = new Mono.Cecil.Pdb.PdbReaderProvider(); } else if (File.Exists(mdb)) { provider = new Mono.Cecil.Mdb.MdbReaderProvider(); } read_params.SymbolReaderProvider = provider; read_params.ReadSymbols = true; write_params.WriteSymbols = true; if (!String.IsNullOrEmpty(keyfile) && File.Exists(keyfile)) { keyfile = Path.GetFullPath(keyfile); var fs = new FileStream(keyfile, FileMode.Open); var keypair = new System.Reflection.StrongNameKeyPair(fs); fs.Close(); write_params.StrongNameKeyPair = keypair; } else { Console.Error.WriteLine("No keyfile specified or keyfile missing."); } // Load assembly and process all modules var assembly = AssemblyDefinition.ReadAssembly(file, read_params); var rewritten = assembly.CustomAttributes.FirstOrDefault(a => a.AttributeType.Name == "RewrittenAttribute"); if (rewritten == null) { foreach (var module in assembly.Modules) { foreach (var reference in module.AssemblyReferences) { var resolved = module.AssemblyResolver.Resolve(reference); if (reference.Name == "mscorlib") { mscorlib = resolved; } } } if (mscorlib == null) { Console.Error.WriteLine("Failed to locate mscorlib"); return; } TypeMarshal = mscorlib.MainModule.GetType("System.Runtime.InteropServices.Marshal"); TypeStringBuilder = mscorlib.MainModule.GetType("System.Text.StringBuilder"); TypeVoid = mscorlib.MainModule.GetType("System.Void"); TypeIntPtr = mscorlib.MainModule.GetType("System.IntPtr"); TypeInt32 = mscorlib.MainModule.GetType("System.Int32"); TypeBindingsBase = assembly.Modules.Select(m => m.GetType("OpenTK.BindingsBase")).First(); foreach (var module in assembly.Modules) { foreach (var type in module.Types) { Rewrite(type, options); } } } else { Console.Error.WriteLine("Error: assembly has already been rewritten"); } // Save rewritten assembly assembly.Write(file, write_params); }
public CorDebugAssembly(CorDebugProcess process, string name, Pdbx.PdbxFile pdbxFile, uint idx) { m_process = process; m_appDomain = null; m_name = name; m_pdbxFile = pdbxFile; m_pdbxAssembly = (pdbxFile != null) ? pdbxFile.Assembly : null; m_htTokenCLRToPdbx = new Hashtable(); m_htTokenTinyCLRToPdbx = new Hashtable(); m_idx = idx; m_primaryAssembly = null; m_isFrameworkAssembly = false; if (m_pdbxAssembly != null) { if (!string.IsNullOrEmpty(pdbxFile.PdbxPath)) { string pth = pdbxFile.PdbxPath.ToLower(); if (pth.Contains(@"\buildoutput\")) { #region V4_1_FRAMEWORK_ASSEMBLIES List <string> frameworkAssemblies = new List <string> { "mfdpwsclient", "mfdpwsdevice", "mfdpwsextensions", "mfwsstack", "microsoft.spot.graphics", "microsoft.spot.hardware", "microsoft.spot.hardware.serialport", "microsoft.spot.hardware.usb", "microsoft.spot.ink", "microsoft.spot.io", "microsoft.spot.native", "microsoft.spot.net", "microsoft.spot.net.security", "microsoft.spot.time", "microsoft.spot.tinycore", "microsoft.spot.touch", "mscorlib", "system.http", "system.io", "system.net.security", "system", "system.xml.legacy", "system.xml", }; #endregion // V4_1_FRAMEWORK_ASSEMBLIES m_isFrameworkAssembly = (frameworkAssemblies.Contains(name.ToLower())); } else { m_isFrameworkAssembly = pdbxFile.PdbxPath.ToLower().Contains(Path.PathSeparator + ".net micro framework" + Path.PathSeparator); } } m_pdbxAssembly.CorDebugAssembly = this; foreach (Pdbx.Class c in m_pdbxAssembly.Classes) { AddTokenToHashtables(c.Token, c); foreach (Pdbx.Field field in c.Fields) { AddTokenToHashtables(field.Token, field); } foreach (Pdbx.Method method in c.Methods) { AddTokenToHashtables(method.Token, method); } } if (File.Exists(Path.ChangeExtension(m_pdbxFile.PdbxPath, ".dll"))) { MetaData = ModuleDefinition.ReadModule(Path.ChangeExtension(m_pdbxFile.PdbxPath, ".dll")); } else if (File.Exists(Path.ChangeExtension(m_pdbxFile.PdbxPath, ".exe"))) { MetaData = ModuleDefinition.ReadModule(Path.ChangeExtension(m_pdbxFile.PdbxPath, ".exe")); } if (MetaData != null && File.Exists(Path.ChangeExtension(m_pdbxFile.PdbxPath, ".pdb"))) { DebugData = new Mono.Cecil.Pdb.PdbReaderProvider().GetSymbolReader(MetaData, Path.ChangeExtension(m_pdbxFile.PdbxPath, ".pdb")); MetaData.ReadSymbols(DebugData); } else if (MetaData != null && File.Exists(Path.ChangeExtension(m_pdbxFile.PdbxPath, ".exe.mdb"))) { DebugData = new Mono.Cecil.Mdb.MdbReaderProvider().GetSymbolReader(MetaData, Path.ChangeExtension(m_pdbxFile.PdbxPath, ".exe")); MetaData.ReadSymbols(DebugData); } else if (MetaData != null && File.Exists(Path.ChangeExtension(m_pdbxFile.PdbxPath, ".dll.mdb"))) { DebugData = new Mono.Cecil.Mdb.MdbReaderProvider().GetSymbolReader(MetaData, Path.ChangeExtension(m_pdbxFile.PdbxPath, ".dll")); MetaData.ReadSymbols(DebugData); } } }
static void Main(string[] args) { string input = null; string output = null; string keyPairContainer = null; var options = new Mono.Options.OptionSet() { { "i|input=", i => input = i }, { "o|output:", o => output = o }, { "k|key:", k => keyPairContainer = k }, }; try { var extra = options.Parse(args); var pdb = Path.ChangeExtension(input, "pdb"); var mdb = Path.ChangeExtension(input, "mdb"); ISymbolReaderProvider provider = null; if (File.Exists(pdb)) { provider = new Mono.Cecil.Pdb.PdbReaderProvider(); } else if (File.Exists(mdb)) { provider = new Mono.Cecil.Mdb.MdbReaderProvider(); } var assemblyResolver = new DefaultAssemblyResolver(); assemblyResolver.AddSearchDirectory(System.IO.Path.GetDirectoryName(input)); var readParameters = new ReaderParameters() { AssemblyResolver = assemblyResolver, ReadingMode = ReadingMode.Immediate, ReadSymbols = true, SymbolReaderProvider = provider, }; var writeParameters = new WriterParameters() { WriteSymbols = true, }; if (keyPairContainer != null) { writeParameters.StrongNameKeyPair = new System.Reflection.StrongNameKeyPair(keyPairContainer); } if (output == null) { output = input; } Console.WriteLine("CilTK Rewriter"); Console.WriteLine("Reading assembly from {0}", input); Console.WriteLine("Writing assembly to {0}", output); InputAssembly = input; var assembly = Mono.Cecil.AssemblyDefinition.ReadAssembly(input, readParameters); var labelReplace = new LabelReplacer(); labelReplace.Visit(assembly); var infoReplace = new InfoReplacer(); infoReplace.Visit(assembly); var cilReplacer = new CilReplacer(labelReplace); cilReplacer.Visit(assembly); //remove references to Silk foreach (var module in assembly.Modules) { int index = -1; for (int i = 0; i < module.AssemblyReferences.Count; ++i) { if (module.AssemblyReferences[i].Name == "Silk") { index = i; break; } } if (index != -1) { module.AssemblyReferences.RemoveAt(index); } } //write to a temp file then copy to output to assist with debugging var temp = System.IO.Path.GetTempFileName(); assembly.Write(temp, writeParameters); System.IO.File.Copy(temp, output, true); } catch (Mono.Options.OptionException) { options.WriteOptionDescriptions(Console.Out); System.Environment.Exit(1); } }
public CorDebugAssembly (CorDebugProcess process, string name, Pdbx.PdbxFile pdbxFile, uint idx) { m_process = process; m_appDomain = null; m_name = name; m_pdbxFile = pdbxFile; m_pdbxAssembly = (pdbxFile != null) ? pdbxFile.Assembly : null; m_htTokenCLRToPdbx = new Hashtable (); m_htTokenTinyCLRToPdbx = new Hashtable (); m_idx = idx; m_primaryAssembly = null; m_isFrameworkAssembly = false; if (m_pdbxAssembly != null) { if (!string.IsNullOrEmpty (pdbxFile.PdbxPath)) { string pth = pdbxFile.PdbxPath.ToLower (); if (pth.Contains (@"\buildoutput\")) { #region V4_1_FRAMEWORK_ASSEMBLIES List<string> frameworkAssemblies = new List<string> { "mfdpwsclient", "mfdpwsdevice", "mfdpwsextensions", "mfwsstack", "microsoft.spot.graphics", "microsoft.spot.hardware", "microsoft.spot.hardware.serialport", "microsoft.spot.hardware.usb", "microsoft.spot.ink", "microsoft.spot.io", "microsoft.spot.native", "microsoft.spot.net", "microsoft.spot.net.security", "microsoft.spot.time", "microsoft.spot.tinycore", "microsoft.spot.touch", "mscorlib", "system.http", "system.io", "system.net.security", "system", "system.xml.legacy", "system.xml", }; #endregion // V4_1_FRAMEWORK_ASSEMBLIES m_isFrameworkAssembly = (frameworkAssemblies.Contains (name.ToLower ())); } else { m_isFrameworkAssembly = pdbxFile.PdbxPath.ToLower().Contains(Path.PathSeparator + ".net micro framework" + Path.PathSeparator); } } m_pdbxAssembly.CorDebugAssembly = this; foreach (Pdbx.Class c in m_pdbxAssembly.Classes) { AddTokenToHashtables (c.Token, c); foreach (Pdbx.Field field in c.Fields) { AddTokenToHashtables (field.Token, field); } foreach (Pdbx.Method method in c.Methods) { AddTokenToHashtables (method.Token, method); } } if (File.Exists (Path.ChangeExtension (m_pdbxFile.PdbxPath, ".dll"))) MetaData = ModuleDefinition.ReadModule (Path.ChangeExtension (m_pdbxFile.PdbxPath, ".dll")); else if (File.Exists (Path.ChangeExtension (m_pdbxFile.PdbxPath, ".exe"))) MetaData = ModuleDefinition.ReadModule (Path.ChangeExtension (m_pdbxFile.PdbxPath, ".exe")); if (MetaData != null && File.Exists (Path.ChangeExtension (m_pdbxFile.PdbxPath, ".pdb"))) { DebugData = new Mono.Cecil.Pdb.PdbReaderProvider ().GetSymbolReader (MetaData, Path.ChangeExtension (m_pdbxFile.PdbxPath, ".pdb")); MetaData.ReadSymbols (DebugData); } else if (MetaData != null && File.Exists (Path.ChangeExtension (m_pdbxFile.PdbxPath, ".exe.mdb"))) { DebugData = new Mono.Cecil.Mdb.MdbReaderProvider ().GetSymbolReader (MetaData, Path.ChangeExtension (m_pdbxFile.PdbxPath, ".exe")); MetaData.ReadSymbols (DebugData); } else if (MetaData != null && File.Exists (Path.ChangeExtension (m_pdbxFile.PdbxPath, ".dll.mdb"))) { DebugData = new Mono.Cecil.Mdb.MdbReaderProvider ().GetSymbolReader (MetaData, Path.ChangeExtension (m_pdbxFile.PdbxPath, ".dll")); MetaData.ReadSymbols (DebugData); } } }