了解IlMerge - 如何使用所有与之关联的dll打包可执行文件

时间:2012-09-06 20:07:38

标签: c# .net winforms dll ilmerge

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

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

  • 我编写的库没有自己的依赖
  • 我编写的库依赖于我编写的其他库
  • 我编写的依赖于第三方dll的库
  • 第三方独立dll
  • 第三方dll与其他dll有自己的依赖

因此,在编译应用程序之后,我有一个带有可执行文件和大约15个dll的目录。

我想将所有dll打包成一个可执行文件,这样我就可以简单地分发一个可执行文件。

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

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

我决定使用Costura Visual Studio Extensions located here

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

这里很棒的是你只需将扩展安装到Visual Studio中。完成此操作后,对于要将DLL打包为单个可执行文件的任何项目,只需选择项目,单击菜单栏上的项目,Costura,配置,然后单击确定。它会要求您重新加载项目 - 单击是。现在,无论何时构建项目,它都只会创建一个可执行文件(如果您在库中执行它,则会创建DLL)。不可能更容易。

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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

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

使用ILMerge的另一种方法是将二进制文件嵌入到程序集as desribed here中。