1

我知道我不是第一个在 Stack Overflow 上提出这个问题的人,而且我相信我不会是最后一个。但是,在花了几个小时研究如何做到这一点,然后在身体上尝试做到这一点之后,我几乎准备放弃了。

我有一个构建为可执行文件的 .NET Framework 4、C#、WinForms 应用程序。我依赖很多很多 dll。dll 分为多个类别。

  • 我编写的库没有自己的依赖项
  • 我编写的库依赖于我编写的其他库
  • 我编写的依赖第三方 dll 的库
  • 第三方独立 dll
  • 第三方 dll 具有自己对其他 dll 的依赖关系

所以在我编译我的应用程序后,我有一个包含可执行文件和大约 15 个 dll 的目录。

我想将所有 dll 打包到一个可执行文件中,以便我可以简单地分发一个可执行文件。

我知道 IlMerge 是通常建议使用的应用程序,但我很好奇是否有更容易使用、更直观且适用于 WinForms 和 WPF 的东西。

4

4 回答 4

3

这里的问题是ILMerge 只能合并.Net 程序集。您的文件 lame_enc.dll 不是 .Net 程序集,而是标准 Windows dll,因此 ILMerge 无法加载。

为了解决这个问题,您可以将 lame_enc.dll 嵌入到您的程序集中,然后在应用程序需要时将其提取出来。查看这篇文章以获取更多信息。

http://weblogs.asp.net/ralfw/archive/2007/02/04/single-assembly-deployment-of-managed-and-unmanaged-code.aspx

于 2012-09-06T20:29:38.600 回答
1

最后,我走向了完全不同的方向。

我决定使用位于此处的 Costura Visual Studio Extensions

这些扩展使用两种方法的组合

这里的好处是您只需将扩展安装到 Visual Studio 中。完成此操作后,对于要将 DLL 打包到单个可执行文件中的任何项目,只需选择该项目,单击菜单栏上的项目、Costura、配置,然后单击确定。它会要求您重新加载项目 - 单击是。现在,每当您构建项目时,它只会创建一个可执行文件(或 DLL,如果您在库上执行它)。再简单不过了。

于 2012-09-10T17:41:19.567 回答
0

ILMerge 仅组合纯(非混合模式)CLR 程序集。它的工作原理是提取所有 CIL 模块,然后将它们重新链接到一个新的程序集中。装配资源也被重新组合。

ILMerge 无法合并本机可执行代码。lame_enc.dll 是一个原生 DLL 文件,不包含任何 CIL 模块,这就是你不能组合它的原因。

如果您想将您的应用程序打包到一个可执行文件中,一种解决方法是将 lame_enc.dll 作为程序集资源包含在内,然后将 lame_enc.dll 保存到磁盘中的临时文件夹中,然后将保存的文件夹添加到应用程序的 PATH 中,因此您的 [DllImport] 运行时链接器将能够访问它。

于 2012-09-06T20:25:14.380 回答
0

要解决您的确切问题,请验证该文件是否C:\Release\lame_enc.dll存在并且它实际上是一个 .NET 文件。ILMerge 只能合并 .NET 程序集。

现在,如果您只担心应用程序的分发,您可以考虑创建一个安装程序来安装所有二进制文件,而不必担心使用 ILMerge 合并它们。

使用 ILMerge 的另一种替代方法是将二进制文件嵌入到程序集中,如此处所述。

于 2012-09-06T20:27:40.760 回答