如何调试到ILMerged程序集?
欲改变的2组件的解决方案,从而使得对ILMerge呼叫被调用,并且在一个单一的组件,构建结果的构建过程。此外,我希望能够调试到生成的程序集。
准备 - 一个简单的例子
- 新的解决方案 - ClassLibrary1的
- 创建Class1的静态功能 '的GetMessage',返回的字符串 “Hello World”
- 创建新的控制台应用程序,它引用ClassLibrary。
- 通过控制台从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
我会建议你只ILMerge发布版本的组件。我无法想象合并调试程序集会带来什么好处。
我已经添加到我原来的问题解释(种)为什么我想这样做。 – 2010-06-17 21:48:50
关于你的更新,我认为你正在解决更多的问题,然后通过尝试走这条路线来解决问题。用您的更新作为问题开始一个新问题 - 与您尝试的方法相比,肯定有更好的解决方案。 – 2010-06-17 23:18:43
我不确定我明白...你在暗示我问什么? – 2010-06-18 08:44:55
对不起,你有问题。我没有遵循你的确切步骤,但我创建了一个控制台应用程序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对于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
它的工作原因是你没有重新命名的东西(请参阅我的答案) 。 – 2015-08-06 07:48:16
我试图做这样的事情,发现你不应该重命名任何东西,既不合并之后。移动东西到单独的目录是好的。如果你不重命名任何东西,它就会起作用。
不是有一个蝙蝠脚本,有一两件事你可以做的是创建一个第三个项目(类型ClassLibrary将工作),其依赖是ConsoleApp和ClassLibrary;称之为PostSolutionBuildEvents。然后将其后构建为ILMerge命令。这样,你可以像'$(SolutionDir)'一样访问所有的宏。 – 2010-06-17 20:43:25
注意:您不需要为此目的使用GAC东西,当您没有解决此问题时,GACd到您的应用程序配置文件 – 2010-06-17 21:56:15
的任何内容都可以从“它正常工作”的范围内获得大量选项。同样的问题在这里... – 2011-12-15 15:20:30