如何调试ILMerged程序集?

时间:2010-06-17 19:01:53

标签: debugging symbols ilmerge visual-studio-2010

摘要

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

准备 - 一个简单的例子

  1. 新解决方案 - ClassLibrary1
  2. 在Class1中创建一个静态函数'GetMessage',它返回字符串“Hello world”
  3. 创建引用ClassLibrary的新控制台应用程序。
  4. 通过控制台从main()输出GetMessage。
  5. 你现在有一个2组装应用程序,它将“Hello World”输出到控制台。

    那么下一步..?

    我想更改Console应用程序构建过程,包括使用ILMerge的post构建步骤,将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。但是它似乎不会生成符号(.pdb文件),VS可以使用它来调试代码。

    我认为这是这个难题的最后一部分。

    有谁知道如何才能使这项工作?

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

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

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

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

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

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

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

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

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

4 个答案:

答案 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发布版本。