7

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

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 调试器,但它只是逐步执行方法调用。

4

2 回答 2

4

您需要将生成的代码标记为可调试。
就像是:

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);

您现在应该能够进入动态生成的方法。

于 2013-08-01T14:02:16.617 回答
2

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

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

于 2013-08-01T14:12:05.873 回答