public AssemblyProcessorContext(CustomAssemblyResolver assemblyResolver, AssemblyDefinition assembly, PlatformType platform, TextWriter log) { AssemblyResolver = assemblyResolver; Assembly = assembly; Platform = platform; Log = log; }
public CustomAssemblyResolver CreateAssemblyResolver() { var assemblyResolver = new CustomAssemblyResolver(); assemblyResolver.RemoveSearchDirectory("."); foreach (string searchDirectory in SearchDirectories) { assemblyResolver.AddSearchDirectory(searchDirectory); } return(assemblyResolver); }
public bool Run(string inputFile, string outputFile = null) { if (inputFile is null) { throw new ArgumentNullException(nameof(inputFile)); } if (outputFile is null) { outputFile = inputFile; } CustomAssemblyResolver assemblyResolver = null; AssemblyDefinition assemblyDefinition = null; try { try { assemblyResolver = CreateAssemblyResolver(); var readWriteSymbols = UseSymbols; // Double check that var symbolFile = Path.ChangeExtension(inputFile, "pdb"); if (!File.Exists(symbolFile)) { readWriteSymbols = false; } assemblyDefinition = AssemblyDefinition.ReadAssembly(inputFile, new ReaderParameters { AssemblyResolver = assemblyResolver, ReadSymbols = readWriteSymbols, ReadWrite = true }); // Check if pdb was actually read readWriteSymbols = assemblyDefinition.MainModule.SymbolReader != null; var symbolWriterProvider = assemblyDefinition.MainModule.SymbolReader?.GetWriterProvider(); var result = Run(ref assemblyDefinition, out bool modified, out var serializationHash); if (modified || inputFile != outputFile) { // Make sure output directory is created var outputDirectory = Path.GetDirectoryName(outputFile); if (!string.IsNullOrEmpty(outputDirectory) && !Directory.Exists(outputDirectory)) { Directory.CreateDirectory(outputDirectory); } // Keep the original assembly by adding a .old prefix to the current extension if (KeepOriginal) { var copiedFile = Path.ChangeExtension(inputFile, "old" + Path.GetExtension(inputFile)); File.Copy(inputFile, copiedFile, true); } if (assemblyDefinition.MainModule.FileName != outputFile) { // NOTE: Using FileShare.Read otherwise often had access conflict (maybe with antivirus or window ssearch?) assemblyDefinition.MainModule.Write(outputFile, new WriterParameters() { WriteSymbols = readWriteSymbols, SymbolWriterProvider = symbolWriterProvider }); } else { assemblyDefinition.MainModule.Write(new WriterParameters() { WriteSymbols = readWriteSymbols }); } } if (serializationHash != null) { var assemblySerializationHashFile = Path.ChangeExtension(outputFile, ".sdserializationhash"); // Check and update current value (if it exists) var serializationHashString = serializationHash.Value.ToString(); if (!File.Exists(assemblySerializationHashFile) || File.ReadAllText(assemblySerializationHashFile, Encoding.UTF8) != serializationHashString) { File.WriteAllText(assemblySerializationHashFile, serializationHashString, Encoding.UTF8); } } return(result); } finally { assemblyResolver?.Dispose(); assemblyDefinition?.Dispose(); } } catch (Exception e) { OnErrorAction(null, e); if (DeleteOutputOnError) { File.Delete(outputFile); } return(false); } }
public AssemblyProcessorContext(CustomAssemblyResolver assemblyResolver, AssemblyDefinition assembly, TextWriter log) { AssemblyResolver = assemblyResolver; Assembly = assembly; Log = log; }