概括
我想更改 2 组件解决方案的构建过程,以便调用对 ILMerge 的调用,并生成单个程序集。此外,我希望能够调试生成的程序集。
准备 - 一个简单的例子
- 新解决方案 - ClassLibrary1
- 在 Class1 中创建一个静态函数“GetMessage”,它返回字符串“Hello world”
- 创建引用 ClassLibrary 的新控制台应用程序。
- 通过控制台从 main() 输出 GetMessage。
您现在有一个 2 程序集应用程序,它向控制台输出“Hello World”。
那么接下来呢..?
我想更改控制台应用程序构建过程,包括使用 ILMerge 的构建后步骤,将 ClassLibrary 程序集合并到控制台程序集中
在这一步之后,我应该能够:
- 在不存在 ClassLibrary1.dll 的情况下直接运行控制台应用程序
- 在 VS 中通过 F5(或 F11)运行控制台应用程序,并能够调试到 2 个项目中的每一个。
有限的成功
我阅读了这篇博文,并设法通过构建后命令实现了我所追求的合并...
"$(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 吗?”
我的解决方案的程序集需要与其他解决方案的程序集共存于同一文件夹中(其中一些我可能会开发)
其中一些解决方案将共享对某些程序集的不同版本的依赖关系。
因此,Solution1 可能由 Console1 和 ClassLibrary1.dll(v1) 组成,Solution2 可能由 Console2 和 Classlibrary1.dll(v2) 组成。
我认为我可以将正确版本的依赖项合并到解决方案的主要程序集中以避免冲突,而不是在 GAC 中注册所有内容。
但是,这目前导致无法调试解决方案,我需要与将出现的其他解决方案一起进行。
这听起来很复杂吗?那是因为它是.. :D