Is there a way to make debugger work with modified assembly

115 views Asked by At

I am trying to modify assembly before using it.
Main file:

using IlGenTestTarget;
using Lokad.ILPack;
using System.Reflection;
using Mono.Cecil;
using IlGenTest;

Assembly inAssembly = Assembly.GetAssembly(typeof(Class1));
AssemblyGenerator assemblyGenerator = new AssemblyGenerator();
byte[] b = assemblyGenerator.GenerateAssemblyBytes(inAssembly);
AssemblyDefinition assemblyDefinition = AssemblyDefinition.ReadAssembly(new MemoryStream(b));
foreach (ModuleDefinition module in assemblyDefinition.Modules) {
    IlGenTestUtils.RemoveRemovedElements(module.Types);
    foreach (TypeDefinition type in module.Types) {
        IlGenTestUtils.RemoveRemovedElements(type.Methods);
        IlGenTestUtils.RemoveRemovedElements(type.Fields);
    }
}
MemoryStream ms = new MemoryStream();
assemblyDefinition.Write(ms);
byte[] res = ms.ToArray();
Assembly resAssembly = Assembly.Load(res);
Module resModule = resAssembly.GetModules()[0];
Type resType = resModule.GetType("IlGenTestTarget.Class1");
MethodInfo resMethod = resType.GetMethod("Method1");
resMethod.Invoke(null, null);

IlGenTestUtils:

using Mono.Cecil;
using Mono.Collections.Generic;

namespace IlGenTest
{
    public class IlGenTestUtils
    {
        public static List<T> GetRemovedElements<T>(Collection<T> collection) where T : ICustomAttributeProvider
        {
            return collection
                .Where(t => t.CustomAttributes.Any(attr => attr.AttributeType.Name == "RemovedAttribute"))
                .ToList();
        }

        public static void RemoveRemovedElements<T>(Collection<T> collection) where T : ICustomAttributeProvider
        {
            foreach (T t in GetRemovedElements<T>(collection))
            {
                collection.Remove(t);
            }
        }
    }
}

When I put breakpoint on Method1, everything works fine, but progam is not paused on it. When I invoke Method1 directly, without creating new assembly, program is paused on breakpoint as expected. Is there a way to make breakpoints work with dynamic assembly?

1

There are 1 answers

4
Peter B On

The link between "source line at which a breakpoint is placed" and "assembly file contents" is defined by the .pdb file for the assembly. After modifying the assembly, I would actually be surprised if the link between them would still work.

You would need to also rebuild the .pdb file, which seems hard if not impossible.