如何将多个程序集合并成一个?
我使用EXE项目(Azure应用程序的启动任务)来使用我的服务堆栈,因为我已经将以下服务堆栈的DLL和一些Azure的DLL复制到EXE项目中。
当我构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(与标准输出一起,其中大部分现在不是必需的),这也是压缩的。 这可以单独使用。
许可证是麻省理工学院,因此您可以根据需要修改/分发。