/// <summary> /// /// </summary> /// <param name="assemblyPath"></param> /// <param name="currentPath"></param> /// <param name="savePath"></param> /// <returns></returns> public static bool BuildToFile(string assemblyPath, string currentPath, string savePath = null) { bool setSuccess = false; if (string.IsNullOrEmpty(savePath)) { savePath = assemblyPath; } string pdbFile = Path.ChangeExtension(assemblyPath, "pdb"); PdbReaderProvider readerProvider = null; PdbWriterProvider writerProvider = null; bool debug = false; if (File.Exists(pdbFile)) { debug = true; readerProvider = new PdbReaderProvider(); writerProvider = new PdbWriterProvider(); } //huhu modify reason: Support for model debugging. var ass = AssemblyDefinition.ReadAssembly(assemblyPath, new ReaderParameters { SymbolReaderProvider = readerProvider, ReadSymbols = debug }); BaseAssemblyResolver resolver = ass.MainModule.AssemblyResolver as BaseAssemblyResolver; if (resolver != null) { resolver.AddSearchDirectory(currentPath); } var types = ass.MainModule.Types.Where(p => !p.IsEnum).ToList(); foreach (TypeDefinition type in types) { setSuccess = ProcessEntityType(type, setSuccess, currentPath); } //modify reason: no model. ass.Write(savePath, new WriterParameters { SymbolWriterProvider = writerProvider, WriteSymbols = debug }); return true; }
/// <summary> /// /// </summary> /// <param name="assemblyPath"></param> /// <param name="outputAssembly"></param> /// <returns></returns> public static bool BuildToStream(string assemblyPath, out Stream outputAssembly) { bool setSuccess = false; string currentPath = Path.GetDirectoryName(assemblyPath); outputAssembly = new MemoryStream(); using (Stream stream = ReadAssembly(assemblyPath)) { string pdbFile = Path.ChangeExtension(assemblyPath, "pdb"); PdbReaderProvider readerProvider = null; PdbWriterProvider writerProvider = null; bool debug = false; if (File.Exists(pdbFile)) { debug = true; readerProvider = new PdbReaderProvider(); writerProvider = new PdbWriterProvider(); } var ass = AssemblyDefinition.ReadAssembly(stream, new ReaderParameters { SymbolReaderProvider = readerProvider, ReadSymbols = debug }); var types = ass.MainModule.Types.Where(p => !p.IsEnum).ToList(); foreach (TypeDefinition type in types) { setSuccess = ProcessEntityType(type, setSuccess, currentPath); } if (setSuccess) { ass.Write(outputAssembly, new WriterParameters { SymbolWriterProvider = writerProvider, WriteSymbols = debug }); return true; } } return false; }