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

2011-11-10 c# assemblies exe ilmerge servicestack

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

dll文件

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

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

JsonServiceClient client = new JsonServiceClient(servicepath);

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

Answers

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

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

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

您有几种选择:

要么

要么

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

尝试ILMerge-GUI(.NET合并) 。 这是一个基于GUI的Ilmerge ,可避免所有命令行工作。

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

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

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

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

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

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

特征:

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

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

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

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

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

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

.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

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

Related