Debugging 如何调试到ILM程序集中?

Debugging 如何调试到ILM程序集中?,debugging,symbols,ilmerge,visual-studio-2010,Debugging,Symbols,Ilmerge,Visual Studio 2010,摘要 我想改变2-assembly解决方案的构建过程,以便调用对ILMerge的调用,并生成单个程序集。此外,我希望能够调试到结果程序集中 准备-一个简单的示例 新解决方案-ClassLibrary1 在Class1中创建一个静态函数“GetMessage”,返回字符串“Hello world” 创建引用类库的新控制台应用程序 通过控制台从main()输出GetMessage 你现在有了一个2汇编应用程序,可以将“Hello World”输出到控制台 那么接下来怎么办? 我想改变控制台应用程序的

摘要

我想改变2-assembly解决方案的构建过程,以便调用对ILMerge的调用,并生成单个程序集。此外,我希望能够调试到结果程序集中

准备-一个简单的示例

  • 新解决方案-ClassLibrary1
  • 在Class1中创建一个静态函数“GetMessage”,返回字符串“Hello world”
  • 创建引用类库的新控制台应用程序
  • 通过控制台从main()输出GetMessage
  • 你现在有了一个2汇编应用程序,可以将“Hello World”输出到控制台

    那么接下来怎么办?

    我想改变控制台应用程序的构建过程,包括使用ILMerge的构建后步骤,以将类库程序集合并到控制台程序集中

    完成此步骤后,我应该能够:

    • 在不存在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吗?”

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

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

    因此,解决方案1可能由Console1和ClassLibrary1.dll(v1)组成,而解决方案2可能由Console2和ClassLibrary1.dll(v2)组成

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

    然而,目前这使得调试解决方案变得不可能,我需要结合其他将出现的解决方案进行调试


    这听起来复杂吗?那是因为D

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

    我认为ILMerge做不到。红门的OTOH smartassembly(不是免费的)可以做到这一点,至少它在


    是的,我同意Mike只在发布版本中使用ILMerge。很抱歉,您遇到了问题。我没有遵循您的确切步骤,但我创建了一个控制台应用程序a.exe,它调用了dll中的方法B.dll。我在调试模式下构建了这两个程序集(因此它们都有PDB文件)。然后我将它们合并如下:

    ilmerge/out:foo.exe A.exe B.dll

    (实际上A和B在另一个目录中,所以我的命令行稍微复杂一些,但这不会有什么区别。)ILMerge完成后,当前目录中有两个文件:foo.exe和foo.pdb。然后我键入:

    devenv foo.exe

    这打开了VisualStudio,然后我点击“F10”启动调试器。我能够单步进入可执行文件中的Main方法,然后使用“F11”单步进入原来在B.dll中的方法。调试体验与使用两个程序集的原始VisualStudio解决方案中的调试体验完全相同


    如果您仍然有问题,请随时将整个解决方案放入zip文件并发送给我(microsoft.com的mbarnett),我可以试试。

    我尝试过这样做,发现您不应该重命名任何内容,也不应该在合并之前或之后。将内容移动到单独的目录是可以的。如果您不重命名任何东西,它就可以工作。

    与其使用.bat脚本,您可以做的一件事是创建第三个项目(ClassLibrary类型可以工作),其依赖项是ConsoleApp和ClassLibrary;称之为PostSolutionBuildEvents。然后让它的后期生成成为ILMerge命令。通过这种方式,您可以访问所有宏,如
    $(SolutionDir)
    。注意:您不必为此目的使用GAC工具,有大量的选项,从没有GACd时的“it just works”到应用程序配置文件,您解决过这个问题吗?这里也有同样的问题…我已经在我的原始问题中添加了解释(某种程度上)我为什么要这样做。关于你的更新,我认为你正在制造更多的问题,而你正试图通过这条路线来解决。用你的更新作为问题开始一个新问题-肯定有比你尝试的方法更好的解决方案。我不确定我是否理解。。。您建议我问什么?描述您试图解决的问题(同一目录中具有相同名称但版本不同的多个程序集)并询问是否有人有比滥用ILMerge更好的解决方案。我得到的好处是理解为什么如果我使用ILMerge会出现温莎城堡注册问题,但如果我不使用ILMerge则不会。请+1获得ILMerge作者的回复!如果生成的.pdb文件与合并的程序集位于同一目录中(在我的示例中为exe),则该文件对我来说运行良好。查看类似的问题/答案它之所以有效,是因为您没有重命名内容(请参阅我的答案)。@MikeBarnett只是一个注释。如果out exe具有相同的名称和位置(实质上输出覆盖了原始exe和pdb),则应用程序在启动时会出现崩溃。例如
    ilmerge/out:foo.exe foo.exe B.dll
    。那个