2013-08-01 25 views
3

我有一個動態創建的程序集,一個模塊,一個類和一個動態生成的方法。如何調試動態生成的方法?

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

您需要標記生成的代碼可調試。
喜歡的東西:

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

您現在應該能夠步入動態生成的方法。

+0

我發現一個異常InvalidOperationException:在執行'ISymbolDocumentWriter doc = module.DefineDocument(@「SourceCode.txt」,Guid.Empty,Guid.Empty,Guid.Empty)時不是調試ModuleBuilder;''。 –

+1

當你定義模塊時,你需要告訴它發出符號信息。使用[this](http://msdn.microsoft.com/en-us/library/76xbchca.aspx)構造函數,並將第二個參數設置爲'true'。實際上有一個很好的工作示例[這裏](http://blogs.msdn.com/b/jmstall/archive/2005/02/03/366429.aspx)。 –

1

如果生成的原始IL沒有任何來源,那麼:這是始終將是粗糙的。你可能要考慮一個包狀Sigil,這大約是ILGenerator的包裝,但它會給你有用的錯誤信息(而發光,而不是在運行時),如果你做任何細微的錯誤 - 堆棧損壞等

要麼,或:編寫與模塊保存到磁盤啓用,調試寫常規DLL到磁盤中 - 那麼你可以在DLL,它會發現最常見的錯誤運行PEVerify(再次,堆棧損壞等) 。或者當然 - 你可以將它加載到你最喜歡的IL工具中。