2010-06-17 54 views
8

摘要如何調試到ILMerged程序集?

欲改變的2組件的解決方案,從而使得對ILMerge呼叫被調用,並且在一個單一的組件,構建結果的構建過程。此外,我希望能夠調試到生成的程序集。

準備 - 一個簡單的例子

  1. 新的解決方案 - ClassLibrary1的
  2. 創建Class1的靜態功能 '的GetMessage',返回的字符串 「Hello World」
  3. 創建新的控制檯應用程序,它引用ClassLibrary。
  4. 通過控制檯從main()輸出GetMessage。

您現在有一個2組裝應用程序,它向控制檯輸出「Hello World」。

那麼接下來..?

我想改變的控制檯應用程序的構建過程,包括它使用ILMerge,到ClassLibrary組件合併到控制檯組件

這一步後後生成步驟我應該能夠:

  • 沒有ClassLibrary1.dll本直接運行控制檯應用
  • 在VS運行經由F5(或F11)的控制檯應用程序,並能夠調試到各2個項目的。

有限的成功

我讀this blogpost和管理,以實現合併我是一個生成後命令後...

"$(ProjectDir)ILMerge.bat" "$(TargetDir)" $(ProjectName) 

...和ILMerge。蝙蝠文件,其中讀...

CD %1 
Copy %2.exe temp.exe 
ILMerge.exe /out:%2.exe temp.exe ClassLibrary1.dll 
Del temp.exe 
Del ClassLibrary1.* 

這工作得很好,事實上確實pro根據需要導出一個在VS環境外運行的exe文件。但是它似乎沒有生成符號(.pdb文件),VS可以使用它來調試代碼。

我認爲這是拼圖的最後一塊。

有誰知道我該如何做這項工作?

FWIW我在x64 Win7 x64機器上運行VS2010。

更新:我爲什麼要這麼做?

有人問:'我真的需要在調試場景中使用ILMerge嗎?「

我的解決方案的組件需要在同一文件夾中的其他解決方案(其中一些我可能會開發)共存

一些這些解決方案將不同版本的一些組件的共享依賴性。

所以解決方法1可能是由控制檯1和ClassLibrary1.dll(V1)和溶液2的可能是由Console2和Classlibrary1.dll(V2)的。

而不是註冊在GAC中的一切,我以爲我可以ILMerge的依賴關係的正確版本到解決方案的主要組件,以避免碰撞。

但是目前這使得它不可能調試解決方案,這是我需要的地方做與其他的解決方案,這將是目前結合。

這聽起來很複雜嗎?這是因爲它是..:d

+0

不是有一個蝙蝠腳本,有一兩件事你可以做的是創建一個第三個項目(類型ClassLibrary將工作),其依賴是ConsoleApp和ClassLibrary;稱之爲PostSolutionBuildEvents。然後將其後構建爲ILMerge命令。這樣,你可以像'$(SolutionDir)'一樣訪問所有的宏。 – 2010-06-17 20:43:25

+1

注意:您不需要爲此目的使用GAC東西,當您沒有解決此問題時,GACd到您的應用程序配置文件 – 2010-06-17 21:56:15

+1

的任何內容都可以從「它正常工作」的範圍內獲得大量選項。同樣的問題在這裏... – 2011-12-15 15:20:30

回答

1

我會建議你只ILMerge發佈版本的組件。我無法想象合併調試程序集會帶來什麼好處。

+0

我已經添加到我原來的問題解釋(種)爲什麼我想這樣做。 – 2010-06-17 21:48:50

+0

關於你的更新,我認爲你正在解決更多的問題,然後通過嘗試走這條路線來解決問題。用您的更新作爲問題開始一個新問題 - 與您嘗試的方法相比,肯定有更好的解決方案。 – 2010-06-17 23:18:43

+0

我不確定我明白...你在暗示我問什麼? – 2010-06-18 08:44:55

-1

我不認爲ILMerge可以做到這一點。從紅門(不是免費)OTOH smartassembly可以做到這一點,至少如此說它在features

是的,我同意邁克只使用ILMerge發佈版本。

4

對不起,你有問題。我沒有遵循你的確切步驟,但我創建了一個控制檯應用程序A.exe,它在dll,B.dll中調用了一個方法。我以調試模式構建了兩個程序集(以便它們具有PDB文件)。然後,我合併他們是這樣的:

ilmerge /out:foo.exe A.exe時B.DLL

(其實A和B是在另一個目錄中,所以我的命令行是有點複雜,但這應該沒有什麼不同。)ILMerge完成後,當前目錄中有兩個文件:foo.exe和foo.pdb。然後我輸入:

devenv的foo.exe的

這開闢了Visual Studio的,然後我打 「F10」 鍵啓動調試器。我能夠在可執行文件中進入Main方法,然後使用「F11」進入最初位於B.dll中的方法。調試體驗與原始Visual Studio解決方案中的兩個程序集一樣。

如果您仍然有問題,請(在微軟 COM mbarnett )隨時把你的整個解決方案成zip文件,並將其發送給我,我可以嘗試一下。

+1

+1對於ILMerge作者的迴應!生成的.pdb文件對我來說工作的很好,如果它與合併程序集(在我的情況下是exe)在同一個目錄中。看到類似的問題/答案http://stackoverflow.com/questions/1439721/is-there-a-way-to-merge-pdb-files-with-ilmerge – joelsand 2013-07-17 18:18:24

+0

它的工作原因是你沒有重新命名的東西(請參閱我的答案) 。 – 2015-08-06 07:48:16

0

我試圖做這樣的事情,發現你不應該重命名任何東西,既不合並之後。移動東西到單獨的目錄是好的。如果你不重命名任何東西,它就會起作用。