static void RewriteAssembly (string assemblyLocation, Dictionary<string, string> resourcesStrings, CmdOptions options)
{
- var readerParameters = new ReaderParameters { ReadSymbols = true };
- var assembly = AssemblyDefinition.ReadAssembly (assemblyLocation, readerParameters);
- foreach (var module in assembly.Modules) {
- foreach (var type in module.GetTypes ()) {
- foreach (var method in type.Methods) {
- if (!method.HasBody)
- continue;
-
- foreach (var instr in method.Body.Instructions) {
- if (instr.OpCode != OpCodes.Ldstr)
+ Stream pdbSymbols = null;
+
+ var debugSymbols = Path.ChangeExtension (assemblyLocation, "pdb");
+ if (File.Exists (debugSymbols))
+ pdbSymbols = File.Open (debugSymbols, FileMode.Open, FileAccess.ReadWrite);
+
+ var readerParameters = new ReaderParameters {
+ ReadWrite = true,
+ };
+
+ if (pdbSymbols != null) {
+ readerParameters.ReadSymbols = true;
+ readerParameters.SymbolReaderProvider = new PortablePdbReaderProvider ();
+ readerParameters.SymbolStream = pdbSymbols;
+ }
+
+ using (var assembly = AssemblyDefinition.ReadAssembly (assemblyLocation, readerParameters)) {
+ foreach (var module in assembly.Modules) {
+ foreach (var type in module.GetTypes ()) {
+ foreach (var method in type.Methods) {
+ if (!method.HasBody)
continue;
- string value;
- if (resourcesStrings.TryGetValue ((string)instr.Operand, out value)) {
- if (options.Verbose) {
- Console.WriteLine ($"Replacing '{instr.Operand}' with '{value}'");
- }
+ foreach (var instr in method.Body.Instructions) {
+ if (instr.OpCode != OpCodes.Ldstr)
+ continue;
- instr.Operand = value;
+ string value;
+ if (resourcesStrings.TryGetValue ((string)instr.Operand, out value)) {
+ if (options.Verbose) {
+ Console.WriteLine ($"Replacing '{instr.Operand}' with '{value}'");
+ }
+
+ instr.Operand = value;
+ }
}
}
}
}
+
+ var writerParameters = new WriterParameters ();
+
+ if (pdbSymbols != null) {
+ writerParameters.WriteSymbols = true;
+ writerParameters.SymbolStream = pdbSymbols;
+ writerParameters.SymbolWriterProvider = new PortablePdbWriterProvider ();
+ pdbSymbols.Seek (0, SeekOrigin.Begin);
+ }
+
+ assembly.Write (writerParameters);
}
- var writerParameters = new WriterParameters { WriteSymbols = true };
- assembly.Write (assemblyLocation, writerParameters);
+ pdbSymbols?.Dispose ();
}
static bool LoadGetResourceStrings (Dictionary<string, string> resourcesStrings, CmdOptions options)