摘要
我想改变2程序集解决方案的构建过程,以便调用ILMerge,并且构建会产生单个程序集。此外,我希望能够调试到最终的程序集。
准备 - 一个简单的例子
你现在有一个2组装应用程序,它将“Hello World”输出到控制台。
那么下一步..?
我想更改Console应用程序构建过程,包括使用ILMerge的post构建步骤,将ClassLibrary程序集合并到Console程序集
在这一步之后,我应该能够:
成功有限
我阅读了this blogpost并设法实现了我之后的合并后的构建命令......
"$(ProjectDir)ILMerge.bat" "$(TargetDir)" $(ProjectName)
...和一个读...的ILMerge.bat文件。
CD %1
Copy %2.exe temp.exe
ILMerge.exe /out:%2.exe temp.exe ClassLibrary1.dll
Del temp.exe
Del ClassLibrary1.*
这种方法效果很好,实际上会生成一个根据需要在VS环境之外运行的exe。但是它似乎不会生成符号(.pdb文件),VS可以使用它来调试代码。
我认为这是这个难题的最后一部分。
有谁知道如何才能使这项工作?
FWIW我在x64 Win7 x64机器上运行VS2010。
更新:我为什么要这样做?
有人问道:'在调试场景中我真的需要ILMerge吗?'
我的解决方案的程序集需要与其他解决方案(我可能会开发其中一些解决方案)共存于同一文件夹中
其中一些解决方案将共享某些程序集的不同版本的依赖关系。
因此,Solution1可能由Console1和ClassLibrary1.dll(v1)组成,而Solution2可能由Console2和Classlibrary1.dll(v2)组成。
我没有在GAC中注册所有内容,而是认为我可以将正确版本的依赖项ILMerge到解决方案的主要程序集中以避免冲突。
然而,目前这使得无法调试解决方案,我需要将其与将要出现的其他解决方案结合使用。
这听起来很复杂吗?那是因为它是......:D
答案 0 :(得分: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解决方案中的调试体验相同。
如果您仍然遇到问题,请随时将整个解决方案放入zip文件并发送给我(mbarnett microsoft dot com)我可以尝试一下。
答案 1 :(得分:1)
我建议您只使用ILMerge发布程序集的版本。我无法想象你从合并调试程序集中获得的任何好处。
答案 2 :(得分:0)
我尝试做类似这样的事情,发现你不应该重命名任何东西,在合并之后都没有。将东西移动到单独的目录很好。如果你不重命名任何东西,那就行了。
答案 3 :(得分:-1)
我认为ILMerge无法做到这一点。来自红门(非自由)的OTOH智能装配可以做到这一点,至少它是在features
所说的是的,我同意Mike只使用ILMerge发布版本。