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

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

dll文件

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

我已经使用这个服务栈的DLL来使用

JsonServiceClient client = new JsonServiceClient(servicepath); 

我需要做什么来将所有这些DLL绑定到我的EXE中?

你有几个select:

  • 使用ILMerge (免费)
    如何在这里和这里看到

要么

  • 使用一些工具,如SmartAssembly (商业)
    它可以embedded和合并在其他的东西(不需要改变你的源代码)

要么

  • 代码,你自己在less于10行 (免费,但最小的源代码更改)
    将所有需要的依赖项标记为“embedded式资源” – 这种方式将它们包含在EXE文件中…您需要设置一个AssemblyResolve处理程序,它在运行时从资源中读取并将所需的DLL返回到.NET运行时。

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

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

还有一篇文章介绍了如何在这里包含ILMerge到你的VS项目中

包含引用程序集作为embedded式资源的一个好工具是Costura (一个Fody插件)。 作者Simon Kropp描述如下:

两种方法的组合:

  • Jeffrey Richterbuild议使用embedded式资源作为合并程序集的方法
  • Einar Egilssonbuild议使用cecil来创build模块初始化程序

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

特征:

  • 包括debugging符号
  • embedded程序集的压缩
  • 包括/排除特定的程序集
  • 其他(请参阅自述文件 )

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

检出ServiceStack.Gap项目,其中显示了几个如何将ILMerge ServiceStack转换为单个跨平台.exe的示例。

ServiceStack还包含许多其他function,特别适合于这些创buildembedded式应用程序的地方:

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

如果你有WPF的依赖关系,你的select可能会更有限….. ILMerge似乎不处理这些。 Costura.Fody(如上面的Codefox所提到的)为我们完美地工作,花了大约5分钟的时间来开始…一个非常好的经验。

使用Nuget进行安装(在软件包pipe理器控制台中select正确的默认项目)。

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

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

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