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

时间:2011-11-10 09:43:48

标签: c# assemblies exe ilmerge servicestack

我使用EXE项目(azure应用程序的启动任务)使用我的服务堆栈,因为我复制了以下服务堆栈的DLL&一些Azure的DLL进入EXE项目。

dlls

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

我已经使用此服务堆栈的dll来使用

JsonServiceClient client = new JsonServiceClient(servicepath);

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

7 个答案:

答案 0 :(得分:112)

您有几种选择:

OR

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

OR

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

答案 1 :(得分:29)

您要查找的工具名为ILMerge。 它是一个命令行工具,可以像这样使用:

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

还有一篇文章介绍了如何将ILMerge包含到VS项目设置中here

答案 2 :(得分:22)

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

  

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

     

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

特点:

  • 包含调试符号
  • 嵌入式装配体的压缩
  • 包括/排除特定程序集
  • 其他(见Readme

答案 3 :(得分:7)

试试ILMerge-GUI, the .NET merger。 它是基于GUI的Ilmerge,可以避免所有命令行工作。

答案 4 :(得分:3)

如果您有WPF依赖项,您的选项可能会受到更多限制...... ILMerge似乎没有处理这些问题。 Costura.Fody(正如Codefox上面提到的那样)对我们来说非常合适,然而花了大约5分钟才开始......非常好的体验。

使用Nuget进行安装(在程序包管理器控制台中选择正确的默认项目)。

它合并标记为" Copy Local"的所有DLL。 = true并生成合并的.EXE(与标准输出一起,其中大部分现在不是必需的),也是压缩的。然后可以单独使用它。

许可证是麻省理工学院,因此您可以根据需要修改/分发。

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

答案 5 :(得分:2)

查看ServiceStack.Gap项目,其中显示了如何将ILMerge ServiceStack整合到单个跨平台 .exe 的几个示例。

ServiceStack还包含许多其他功能,特别适合在这些功能中创建嵌入式应用程序:

  • 允许您使用.NET的HTTP侦听器
  • 自行托管您的服务
  • 支持预编译的Razor Views
  • 支持嵌入式资源
  • 支持Sqlite和OrmLite中的嵌入式数据库
  • 可以ILMerged为单个.exe

答案 6 :(得分:0)

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

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

  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

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