/// <summary> /// Rewrites the assemblies specified in the configuration. /// </summary> private static void RewriteAssemblies() { try { if (string.IsNullOrEmpty(Configuration.RewritingConfigurationFile)) { // We are rewriting a dll directly, so we fake up a default configuration for doing this. var fullPath = Path.GetFullPath(Configuration.AssemblyToBeAnalyzed); var assemblyDir = Path.GetDirectoryName(fullPath); Console.WriteLine($". Rewriting {fullPath}"); var config = Rewriting.Configuration.Create(assemblyDir, assemblyDir, new HashSet <string>(new string[] { fullPath })); config.PlatformVersion = Configuration.PlatformVersion; AssemblyRewriter.Rewrite(config); } else { Console.WriteLine($". Rewriting the assemblies specified in {Configuration.RewritingConfigurationFile}"); var config = Rewriting.Configuration.ParseFromJSON(Configuration.RewritingConfigurationFile); config.PlatformVersion = Configuration.PlatformVersion; AssemblyRewriter.Rewrite(config); } Console.WriteLine($". Done rewriting"); } catch (Exception ex) { Debug.WriteLine(ex.StackTrace); Error.ReportAndExit(ex.Message); } }
public static int Main(string[] _args) { try { var options = new RewriteOptions(); foreach (var arg in _args) { ParseArgument(arg, options); } var argv = _args.Where(arg => !arg.StartsWith("-")).ToArray(); var step = (options.Overwrite || options.Audit) ? 1 : 2; if (argv.Length < step) { Usage(); return(1); } int exitCode = 0; for (int i = 0; i < argv.Length; i += step) { var src = argv[i]; var dst = options.Overwrite || options.Audit ? src : argv[i + 1]; if (options.Audit) { Console.WriteLine($"// {src}{Environment.NewLine}===="); } else if (options.Verbose) { Console.WriteLine($"// {Path.GetFileName (src)} -> {Path.GetFullPath (dst)}...{Environment.NewLine}===="); } else if (argv.Length > step) { Console.WriteLine($"// {Path.GetFileName (src)} -> {Path.GetFullPath (dst)}"); } var wroteOk = false; try { var assemblyResolver = new DefaultAssemblyResolver(); assemblyResolver.AddSearchDirectory(Path.GetDirectoryName(src)); using (var def = AssemblyDefinition.ReadAssembly(src, new ReaderParameters { ReadWrite = options.Overwrite, ReadingMode = ReadingMode.Deferred, AssemblyResolver = assemblyResolver, ReadSymbols = options.EnableSymbols, SymbolReaderProvider = new DefaultSymbolReaderProvider(throwIfNoSymbol: false) })) { var arw = new AssemblyRewriter(def, options); int errorCount = arw.Rewrite(); if (options.Mark) { def.Name.Name = Path.GetFileNameWithoutExtension(dst); } if (!options.Audit) { if (errorCount > 0 && false) { Console.Error.WriteLine($"// Not saving due to error(s): {dst}"); exitCode += 1; } else { var shouldWriteSymbols = options.EnableSymbols && def.MainModule.SymbolReader != null; if (options.Overwrite) { def.Write(); } else { def.Write(dst + ".tmp", new WriterParameters { WriteSymbols = shouldWriteSymbols, DeterministicMvid = true }); } wroteOk = true; } } } } catch (Exception exc) { Console.Error.WriteLine("Unhandled exception while rewriting {0}. Continuing...", src); Console.Error.WriteLine(exc); exitCode += 1; } if (wroteOk && !options.Overwrite) { File.Copy(dst + ".tmp", dst, true); if (File.Exists(dst + ".pdb")) { File.Copy(dst + ".pdb", dst.Replace(".exe", ".pdb"), true); File.Delete(dst + ".pdb"); } File.Delete(dst + ".tmp"); } } return(exitCode); } finally { if (Debugger.IsAttached) { Console.WriteLine("Press enter to exit"); Console.ReadLine(); } } }