如何将多个程序集合并为一个?


87

我使用EXE项目(Azure应用程序的启动任务)消耗了服务堆栈,因为我将以下服务堆栈的DLL和某些Azure的DLL复制到了EXE项目中。

dll文件

当我构建此EXE项目时,Azure DLL将与我的EXE捆绑在一起,但是服务堆栈的DLL将不与EXE捆绑在一起,因为要在任何计算机上运行我的EXE,我都需要手动复制所有服务堆栈的DLL。

我已经使用了该服务栈的dll

JsonServiceClient client = new JsonServiceClient(servicepath);

我应该怎么做才能将所有这些DLL捆绑到我的EXE中?

Answers:


120

您有几种选择:

要么

  • 使用诸如SmartAssembly(商业)
    之类的工具,该工具可以嵌入和合并其他工具(无需更改源代码)

要么

  • 您自己少于10行的代码(免费,但源代码更改最少)
    将所有需要的依赖项标记为“嵌入式资源”-这样,它们就包含在EXE文件中...您需要设置一个AssemblyResolve处理程序,该处理程序在运行时从资源中读取并将所需的DLL返回给.NET运行时...

4
感谢您让我想起Jeffrey Richter的嵌入程序集解决方案!请参阅我的答案,其中提到Costura,该工具结合了此功能和注入必要的代码。
CodeFox

29

您正在寻找的工具称为ILMerge。它是一个命令行工具,可以这样使用:

ilmerge /target:winexe /out:MyApp.exe 
        MyExe.exe ServiceStack.dll ServiceStack.Interfaces.dll ServiceStack.ServiceInterface.dll  ServiceStack.Text.dll

还有,描述了如何包括ILMerge到你的VS项目设置的文章在这里


嗨,我可以将外部资源(文件/图像)添加到可执行文件中吗?
Emdadul Sawon

@EmdadulSawon也许您可以将它们作为资源包含在您的一个库中?
亚历山大

27

CosturaFody加载项)是一个很好的工具,可以将引用的程序集作为嵌入式资源包含在内。作者Simon Kropp将其描述如下:

[...]两种方法的组合:

结果是一个超级简单的解决方案,只需要获取Costura.Fody要从NuGet中。

特征:

  • 包括调试符号
  • 嵌入式组件的压缩
  • 包括/排除特定的程序集
  • 其他(请参阅自述文件

9
OMG Costura.Fody是正确的答案。从nuget安装了软件包,重建了项目,现在我有了一个独立的EXE AWESOME!
埃里克·拉巴索斯基

4
我简直不敢相信这是多么容易。只需从nuget安装软件包,即可完成。
iraSenthil '16

2
我也在使用Costura.Fody。设置很简单,并且很容易将NuGet包作为资源包含在内。获取项目。
迈克尔·西尔弗

1
@ user3700562,此技术不会创建新的程序集,而是将一个或多个引用的程序集嵌入到现有程序集中。
CodeFox

1
很好的解决方案!我使用一年以来,没有任何问题。但是请注意,它仅包含您的顶级项目引用的程序集。如果您的应用引用了另一个引用第三方程序集的项目,则需要将其添加到顶级项目中。
德米尔(Demir)'18


3

如果您具有WPF依赖项,则您的选项可能会受到更多限制。..ILMerge似乎没有处理这些问题。但是,Costura.Fody(如上面的Codefox所述)对我们来说效果非常理想,并且花费了大约5分钟的时间才能到达……这是非常好的体验。

使用Nuget进行安装(在Package Manager控制台中选择正确的默认项目)。

它将所有标记为“ Copy Local” = true的DLL合并,并生成一个合并的.EXE(与标准输出一起,现在不再需要其中的大多数),该文件也已压缩。然后可以单独使用。

该许可证是MIT,因此您可以根据需要进行修改/分发。

https://github.com/Fody/Costura/


2

检出ServiceStack.Gap项目,该项目显示了如何将ILMerge ServiceStack合并到单个跨平台.exe中的几个示例。

ServiceStack还包括许多其他功能,这些功能特别适合于以下创建嵌入式应用程序的地方:

  • 允许您使用.NET的HTTP侦听器自托管服务
  • 支持预编译的剃刀视图
  • 支持嵌入式资源
  • 支持Sqlite和OrmLite中的嵌入式数据库
  • 可以ILM合并到单个.exe中

1

.net core 3在项目配置中引入了两个新选项,称为单个文件发布和修剪。

您可以在此处找到有关文档的更多详细信息,此处复制项目配置以供参考。

  1. 项目配置:
    <PropertyGroup>
      <RuntimeIdentifier>win10-x64</RuntimeIdentifier>
      <PublishSingleFile>true</PublishSingleFile>
    </PropertyGroup>

    <PropertyGroup>
      <PublishTrimmed>true</PublishTrimmed>
    </PropertyGroup>
  1. 使用CLI:
    dotnet publish -r win10-x64 -p:PublishSingleFile=true
    dotnet publish -r <rid> -c Release

完全支持将这两个选项组合在一起,以为您的应用获得修剪过的单个组件。


这不会给您带来单一装配。它只是将您的文件压缩为zip存档,然后在您尝试运行该应用程序时将其解压缩到用户文件夹中。
杰斯珀
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.