2011-04-08 107 views
8

我需要使用CodeDomProvider.CompileAssemblyFromSource來編譯一些代碼。如何去調試它?基本上,我想編譯它,創建一個類型的實例,然後進入該類型的代碼。是否可以調試在運行時編譯的代碼?

+0

你是什麼意思「與內存選項」?你有沒有試圖簡單地將調試器連接到正在運行的進程? – 2011-04-08 13:38:57

+1

儘管這可能不是你想要的,那麼只是爲了調試的目的,將程序集生成到磁盤並將其加載,就好像它在現有程序集的哪裏一樣?我知道需要在運行時生成程序集,但是在編譯時選擇某些運行時條件並將其重新生成沒有任何問題:) – OregonGhost 2011-04-08 13:40:30

回答

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

有趣的觀察,像這樣生成的程序集不必以dll結束才能使用,它不會必須有任何擴展。 – epitka 2011-04-08 14:14:05

+0

+1很好的問題和自我回答,非常適合我。我正處於生成和編譯測試代碼的過程中。這很有用。 – 2011-04-08 14:39:22

+0

@Wilkins:謝謝,很高興它幫助了別人。我的東西甚至有一點涉及,我生成的代碼生成的代碼,然後編譯和執行。所以能夠在這裏進行調試對我來說是必須的。 – epitka 2011-04-08 15:37:43

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中找到。

相關問題