摘要
我想改变一个包含两个程序集的解决方案的生成过程,以便调用对ILMerge的调用,并且生成一个程序集。此外,我还希望能够调试到生成的程序集。
准备-简单示例
1.新解决方案-ClassLibrary 1
1.在Class 1中创建一个静态函数“GetMessage”,该函数返回字符串“Hello world”
1.创建引用ClassLibrary的新控制台应用程序。
1.通过控制台从main()输出GetMessage。
您现在有了一个2汇编应用程序,它将“Hello World”输出到控制台。
"接下来怎么办"
我想更改Console应用程序的生成过程,以包括使用ILMerge的生成后步骤,从而将ClassLibrary程序集合并到Console程序集中
完成此步骤后,我应该能够:
- 在不存在ClassLibrary1.dll的情况下直接运行控制台应用程序
- 在VS中通过F5(或F11)运行控制台应用程序,并能够调试到2个项目中的每一个。
有限成功
我读了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文件。但是,它似乎没有产生VS能够用来调试代码的符号(.pdb文件)。
我想这是最后一块拼图了。
有谁知道我该怎么做?
FWIW我在x64 Win7 x64机器上运行VS2010。
更新:为什么要这样做?
有人问:'在调试方案期间,我真的需要ILMerge吗?'
我的解决方案的程序集需要与其他解决方案(其中一些可能是我开发的)的程序集共存于同一文件夹中
其中一些解决方案将共享对某些程序集的不同版本的依赖项。
因此,解决方案1可能由控制台1和ClassLibrary1.dll(v1)组成,解决方案2可能由控制台2和ClassLibrary1.dll(v2)组成。
我认为我可以将依赖项的正确版本ILMerge到解决方案的主程序集中,而不是在GAC中注册所有内容,以避免冲突。
然而,这使得目前不可能调试解决方案,我需要在适当的地方与其他解决方案,这将是目前。
这听起来很复杂吗?那是因为它是...
5条答案
按热度按时间hfyxw5xn1#
很抱歉您遇到了问题。我没有完全按照您的步骤操作,但我创建了一个控制台应用程序A.exe,它调用dll B.dll中的一个方法。我在调试模式下生成了两个程序集(以便它们具有PDB文件)。然后,我将它们合并为如下所示:
文件名:foo.exe A.exe B.dll
(实际上,A和B位于另一个目录中,因此我的命令行稍微复杂一些,但这不会有什么不同。)ILMerge完成后,当前目录中有两个文件:foo.exe和foo.pdb。然后我键入:
开发环境foo.exe
这将打开Visual Studio,然后我按“F10”启动调试器。我能够单步执行可执行文件中的Main方法,然后使用“F11”单步执行原来位于B.dll中的方法。调试体验与在具有两个程序集的原始Visual Studio解决方案中的调试体验完全相同。
如果您仍然有问题,请随时把您的整个解决方案到一个zip文件,并发送给我(mbarnett at microsoft dot com),我可以尝试它。
t9aqgxwy2#
我建议您只使用ILMerge程序集的发布版本。我无法想象您会从合并调试程序集中得到什么好处。
7y4bm7vi3#
我试着做这样的事情,发现你不应该重命名任何东西,无论是在合并之前还是合并之后。移动东西到单独的目录是好的。如果你不重命名任何东西,它的工作。
3gtaxfhh4#
如果您仍在使用ILMerge,就像我一样,还有另一种解决调试问题的方法。至少对我来说,调试是在而不是使用可移植的PDB格式后开始工作的。我的项目是.NET Standard 2.0,我在.NET Framework下运行它。
r8uurelv5#
我不认为ILMerge可以做到这一点。OTOH smartassembly从红门(不是免费的)可以做到这一点,至少它说在features
是的,我同意Mike的观点,只对发布版本使用ILMerge。