我需要使用CodeDomProvider.CompileAssemblyFromSource
來編譯一些代碼。如何去調試它?基本上,我想編譯它,創建一個類型的實例,然後進入該類型的代碼。是否可以調試在運行時編譯的代碼?
8
A
回答
7
當我發佈一個問題後,我意識到我的問題是我從字符串生成程序集,而不是從文件生成。在DEBUG中,我回去並更改了代碼以使用不同的選項運行,並且我能夠從單元測試代碼中直接進入。還必須將GenerateInMemory設置爲false,並將IncludeDebugInformation設置爲true。
#if DEBUG
@params.IncludeDebugInformation = compilationContext.IncludeDebugInformation;
@params.GenerateInMemory = compilationContext.GenerateInMemory;
var fileName = Path.GetFullPath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory,@"..\..\" + compilationContext.AssemblyOutputName + ".cs"));
File.WriteAllText(fileName,compilationContext.StringToCompile);
return _codeDomProvider.CompileAssemblyFromFile(@params,fileName);
#else
return _codeDomProvider.CompileAssemblyFromSource(@params, compilationContext.StringToCompile);
#endif
0
您是否嘗試使用您的代碼從VS中的調試>附加到進程功能附加到進程?
3
有趣的問題。我認爲你最好的選擇是使用WinDbg附加到正在運行的.NET EXE進程(我認爲在將tyoe編譯到內存中後你必須這樣做,因爲EXE的內存地址將會改變 - 我假設) 。
然後,當類型被編譯並在內存中運行時,可以使用SOS.dll中的命令搜索該類型。您也可以使用SOS.dll
放在內存斷點開始使用SOS鏈接
http://rionisimpsoni.wordpress.com/2009/10/08/getting-started-with-windbg-and-sos-dll/
這是一個有點輕描淡寫的回答,因爲解釋如何使用WinDbg和SOS.dll有在網絡上多次被覆蓋。
編輯:
這種方法的利弊的是,你將無法看到源代碼,如Visual Studio顯示。在逐步執行代碼時,您將看到彙編語言顯示。這可能會讓你失望:),但是如果你堅持使用它,並理解一些彙編,你就可以做足夠的事來調試錯誤。
你可以做的另一件事是將.NET程序集從內存中轉儲到磁盤上的文件中。 SOS.dll命令做到這一點,逃脫我現在,我會去尋找它...
啊,這是SaveModule
。一個例子可以在評論here中找到。
相關問題
- 1. 調試運行時編譯代碼?
- 2. 編譯器是否只編譯可以執行的代碼?
- 3. gcc是否可以不編譯代碼?
- 4. 是否有可能在.NET中運行時編譯和執行新代碼?
- 5. 是否可以在LLVM-vs2014的源代碼級進行調試?
- 6. 新的Android運行時(ART)是否僅編譯Java代碼AOT?
- 7. 是否可以在運行時禁用條件編譯符號?
- 8. Fortran 95編譯器是否可以編譯Fortran 77代碼?
- 9. 是否可以在C#中運行時創建/執行代碼?
- 10. 是否可以讓一段代碼僅在調試期間運行?
- 11. 我可以vb.net運行在編譯時
- 12. 是否可以編譯Python以在V8引擎上運行?
- 13. Javascript代碼僅在調試時運行
- 14. 可以編譯一個groovy代碼在JRE中運行嗎?
- 15. 是否可以使用全局變量進行調試代碼
- 16. 使用maven碼頭時:運行 - 是否可以禁用編譯步驟?
- 17. 是否可以在WebGL中每次繪製調用時運行一次代碼?
- 18. 運行時代碼生成和編譯
- 19. 是否可以調試在Visual Studio 2010中進行單元測試的代碼?
- 20. java可以運行一個編譯好的scala代碼嗎?
- 21. 是否可以在FreeBSD上運行Flex SDK編譯器?
- 22. 是否可以交叉編譯MIPS的D源代碼?
- 23. 是否可以使用編譯設置USE_CUDNN:= 1的CPP代碼?
- 24. 重新編譯並在運行時重新運行Java代碼
- 25. 如何在運行時從JTextArea運行/編譯Java代碼?
- 26. 在.Net核心1.0中運行時編譯和運行代碼
- 27. 是否可以使用完整.NET框架的運行時運行Silverlight代碼?
- 28. 是否有可能在運行時反編譯程序
- 29. 有沒有什麼方法可以在運行時編譯C++代碼?
- 30. 是否可以在GA144上運行仿真的C代碼?
你是什麼意思「與內存選項」?你有沒有試圖簡單地將調試器連接到正在運行的進程? – 2011-04-08 13:38:57
儘管這可能不是你想要的,那麼只是爲了調試的目的,將程序集生成到磁盤並將其加載,就好像它在現有程序集的哪裏一樣?我知道需要在運行時生成程序集,但是在編譯時選擇某些運行時條件並將其重新生成沒有任何問題:) – OregonGhost 2011-04-08 13:40:30