public static IModule RewriteModule(IMetadataHost host, ILocalScopeProvider localScopeProvider, ISourceLocationProvider sourceLocationProvider, IModule module) { var m = new PropertyChangedWeaver(host); m._rewriter = new ReferenceReplacementRewriter(host, localScopeProvider, sourceLocationProvider); return m.Rewrite(module); }
public static IModule RewriteModule(IMetadataHost host, ILocalScopeProvider localScopeProvider, ISourceLocationProvider sourceLocationProvider, IModule module) { var m = new PropertyChangedWeaver(host); m._rewriter = new ReferenceReplacementRewriter(host, localScopeProvider, sourceLocationProvider); return(m.Rewrite(module)); }
static int Main(string[] args) { if (args.Length != 1) { Console.WriteLine("Usage: ILWeave [Assembly]"); return(1); } string tmpDir, newName, newPdb; using (var host = new PeReader.DefaultHost()) { var module = host.LoadUnitFrom(args[0]) as IModule; if (module == null || module is Dummy) { Console.WriteLine("{0} is not a PE file containing a CLR assembly, or an error occurred when loading it.", args[0]); return(1); } module = new MetadataDeepCopier(host).Copy(module); PdbReader pdbReader = null; var pdbFile = Path.ChangeExtension(module.Location, "pdb"); if (File.Exists(pdbFile)) { using (var pdbStream = File.OpenRead(pdbFile)) { pdbReader = new PdbReader(pdbStream, host); } } else { Console.WriteLine("Could not load the PDB file for '" + module.Name.Value + "' . Proceeding anyway."); } using (pdbReader) { var localScopeProvider = pdbReader == null ? null : new ILGenerator.LocalScopeProvider(pdbReader); module = PropertyChangedWeaver.RewriteModule( host, localScopeProvider, pdbReader, module); tmpDir = Directory.CreateDirectory(Path.GetRandomFileName()).FullName; newName = Path.Combine(tmpDir, Path.GetFileName(args[0])); using (var peStream = File.Create(newName)) { newPdb = Path.ChangeExtension(newName, ".pdb"); using (var pdbWriter = new PdbWriter(newPdb, pdbReader)) { PeWriter.WritePeToStream(module, host, peStream, pdbReader, localScopeProvider, pdbWriter); } } } } var dst = Path.GetDirectoryName(args[0]); foreach (var s in Directory.GetFiles(tmpDir)) { File.Copy(s, Path.Combine(dst, Path.GetFileName(s)), true); } Directory.Delete(tmpDir, true); return(0); }