如何调试动态生成的方法?

时间:2013-08-01 13:50:03

标签: .net debugging dynamic visual-studio-2012 il

我有一个动态创建的程序集,一个模块,一个类和一个动态生成的方法。

AssemblyBuilder assembly = AppDomain.CurrentDomain.DefineDynamicAssembly(...);
ModuleBuilder module = assembly.DefineDynamicModule(...);
TypeBuilder tb = module.DefineType(...);
MethodBuilder mb = tb.DefineMethod(...);
ILGenerator gen = mb.GetILGenerator();

如何调试使用ILGenerator生成的方法代码?我使用Visual Studio 2012调试器,但它只是逐步调用方法。

2 个答案:

答案 0 :(得分:2)

您需要将生成的代码标记为可调试 类似的东西:

Type daType = typeof(DebuggableAttribute);
ConstructorInfo ctorInfo = daType.GetConstructor(new Type[] { typeof(DebuggableAttribute.DebuggingModes) });
CustomAttributeBuilder caBuilder = new CustomAttributeBuilder(ctorInfo, new object[] { 
  DebuggableAttribute.DebuggingModes.DisableOptimizations | 
  DebuggableAttribute.DebuggingModes.Default
});
assembly.SetCustomAttribute(caBuilder);

您还应该添加源文件:

ISymbolDocumentWriter doc = module.DefineDocument(@"SourceCode.txt", Guid.Empty, Guid.Empty, Guid.Empty);

您现在应该可以进入动态生成的方法。

答案 1 :(得分:1)

如果你在没有任何来源的情况下生成原始IL,那么:这总是很粗糙。您可能需要考虑像Sigil这样的包,它是ILGenerator的包装,但它会为您提供有用的错误消息(在发送时,而不是在运行时),如果您做任何微妙的错误 - 堆栈损坏等。

或者:或者:在启用“保存到磁盘”的情况下写入模块,并在调试期间将常规dll写入磁盘 - 然后您可以在dll上运行PEVerify,这将找到最典型的错误(再次,堆栈损坏等)。或者当然 - 您可以将其加载到您最喜欢的IL工具中。