8

概括

我想更改 2 组件解决方案的构建过程,以便调用对 ILMerge 的调用,并生成单个程序集。此外,我希望能够调试生成的程序集。

准备 - 一个简单的例子

  1. 新解决方案 - ClassLibrary1
  2. 在 Class1 中创建一个静态函数“GetMessage”,它返回字符串“Hello world”
  3. 创建引用 ClassLibrary 的新控制台应用程序。
  4. 通过控制台从 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

4

4 回答 4

5

很抱歉你有问题。我没有按照您的确切步骤进行操作,但我创建了一个控制台应用程序 A.exe,它调用了 dll 中的一个方法 B.dll。我在调试模式下构建了两个程序集(这样它们就有了 PDB 文件)。然后我像这样合并它们:

合并 /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 at microsoft dot com),我可以尝试一下。

于 2010-06-28T04:39:50.627 回答
1

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

于 2010-06-17T19:08:11.493 回答
0

我试图做这样的事情,发现你不应该重命名任何东西,无论是在合并之前还是之后。将东西移动到单独的目录很好。如果您不重命名任何内容,它会起作用。

于 2015-08-06T07:45:56.393 回答
-1

我认为 ILMerge 做不到。来自 red-gate(不是免费)的 OTOH smartassembly 可以做到这一点,至少它在功能上是这么说的

是的,我同意 Mike 仅将 ILMerge 用于发布版本。

于 2010-06-17T19:11:25.893 回答