如何调试到ILMerged程序集?

问题描述:

摘要如何调试到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

我会建议你只ILMerge发布版本的组件。我无法想象合并调试程序集会带来什么好处。

+0

我已经添加到我原来的问题解释(种)为什么我想这样做。 – 2010-06-17 21:48:50

+0

关于你的更新,我认为你正在解决更多的问题,然后通过尝试走这条路线来解决问题。用您的更新作为问题开始一个新问题 - 与您尝试的方法相比,肯定有更好的解决方案。 – 2010-06-17 23:18:43

+0

我不确定我明白...你在暗示我问什么? – 2010-06-18 08:44:55

我不认为ILMerge可以做到这一点。从红门(不是免费)OTOH smartassembly可以做到这一点,至少如此说它在features

是的,我同意迈克只使用ILMerge发布版本。

对不起,你有问题。我没有遵循你的确切步骤,但我创建了一个控制台应用程序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://*.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

我试图做这样的事情,发现你不应该重命名任何东西,既不合并之后。移动东西到单独的目录是好的。如果你不重命名任何东西,它就会起作用。