如何调试ILMerged程序集?

Ror*_*ker 8 debugging ilmerge symbols visual-studio-2010

摘要

我想改变2程序集解决方案的构建过程,以便调用ILMerge,并且构建会产生单个程序集.此外,我希望能够调试到最终的程序集.

准备 - 一个简单的例子

  1. 新解决方案 - ClassLibrary1
  2. 在Class1中创建一个静态函数'GetMessage',返回字符串"Hello world"
  3. 创建引用ClassLibrary的新控制台应用程序.
  4. 通过控制台从main()输出GetMessage.

您现在有一个2组装应用程序,它将"Hello World"输出到控制台.

那么下一步..?

我想改变Console应用程序构建过程,包括使用ILMerge的post构建步骤,将ClassLibrary程序集合并到Console程序集中

在这一步之后,我应该能够:

  • 直接运行控制台应用程序,不存在ClassLibrary1.dll
  • 通过VS中的F5(或F11)运行Console应用程序,并能够调试到2个项目中的每个项目.

成功有限

我阅读了这篇博文,并设法实现了我之后使用后期构建命令进行的合并...

"$(ProjectDir)ILMerge.bat" "$(TargetDir)" $(ProjectName)
Run Code Online (Sandbox Code Playgroud)

...和一个读取的ILMerge.bat文件......

CD %1
Copy %2.exe temp.exe
ILMerge.exe /out:%2.exe temp.exe ClassLibrary1.dll 
Del temp.exe
Del ClassLibrary1.*
Run Code Online (Sandbox Code Playgroud)

这样可以很好地工作,并且实际上产生了一个在VS环境之外运行的exe.但是,它似乎不会产生VS能够用于调试代码的符号(.pdb文件).

我认为这是拼图的最后一块.

有谁知道我怎么能做这个工作?

FWIW我在x64 Win7 x64机器上运行VS2010.

更新:我为什么要这样做?

有人问:'在调试场景中我真的需要ILMerge吗?'

我的解决方案的程序集需要与其他解决方案(其中一些我可能会开发)共存于同一文件夹中

其中一些解决方案将共享某些程序集的不同版本的依赖关系.

因此,Solution1可能由Console1和ClassLibrary1.dll(v1)组成,而Solution2可能由Console2和Classlibrary1.dll(v2)组成.

我没有在GAC中注册所有内容,而是认为我可以将正确版本的依赖项ILMerge到解决方案的主要程序集中以避免冲突.

然而,这目前使得无法调试解决方案,我需要将其与将要出现的其他解决方案结合使用.

这听起来很复杂吗?那是因为它是......:D

小智 5

很抱歉你遇到了问题。我没有按照您的具体步骤操作,但是我创建了一个控制台应用程序 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微软COM),我可以尝试一下。


Mik*_*las 1

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