예제 #1
0
        /// <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);
            }
        }
예제 #2
0
        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();
                }
            }
        }