我使用EXE项目(azure应用程序的启动任务)使用我的服务堆栈,因为我复制了以下服务堆栈的DLL&一些Azure的DLL进入EXE项目。
当我构建这个EXE项目时,Azure DLL将与我的EXE捆绑在一起,但服务堆栈的DLL不会与EXE捆绑在一起,因为要在任何机器上运行我的EXE,我需要手动复制所有服务堆栈的DLL。
我已经使用此服务堆栈的dll来使用
JsonServiceClient client = new JsonServiceClient(servicepath);
我应该怎么做才能将所有这些DLL捆绑到我的EXE中?
答案 0 :(得分:112)
您有几种选择:
OR
OR
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将其描述如下:
[...]两种方法的组合:
- Jeffrey Richter对using embedded resources as a method of merging assemblies
的建议- Einar Egilsson的建议using cecil to create module initializers
结果是一个超级简单的解决方案,只需要从NuGet中获取Costura.Fody。
特点:
答案 3 :(得分:7)
试试ILMerge-GUI, the .NET merger。
它是基于GUI的Ilmerge
,可以避免所有命令行工作。
答案 4 :(得分:3)
如果您有WPF依赖项,您的选项可能会受到更多限制...... ILMerge似乎没有处理这些问题。 Costura.Fody(正如Codefox上面提到的那样)对我们来说非常合适,然而花了大约5分钟才开始......非常好的体验。
使用Nuget进行安装(在程序包管理器控制台中选择正确的默认项目)。
它合并标记为" Copy Local"的所有DLL。 = true并生成合并的.EXE(与标准输出一起,其中大部分现在不是必需的),也是压缩的。然后可以单独使用它。
许可证是麻省理工学院,因此您可以根据需要修改/分发。
答案 5 :(得分:2)
查看ServiceStack.Gap项目,其中显示了如何将ILMerge ServiceStack整合到单个跨平台 .exe 的几个示例。
ServiceStack还包含许多其他功能,特别适合在这些功能中创建嵌入式应用程序:
答案 6 :(得分:0)
.net核心3在项目配置中引入了两个新选项,称为单文件发布和修剪。
您可以找到有关文档here的更多详细信息,此处复制了项目配置以供参考。
<PropertyGroup>
<RuntimeIdentifier>win10-x64</RuntimeIdentifier>
<PublishSingleFile>true</PublishSingleFile>
</PropertyGroup>
<PropertyGroup>
<PublishTrimmed>true</PublishTrimmed>
</PropertyGroup>
dotnet publish -r win10-x64 -p:PublishSingleFile=true
dotnet publish -r <rid> -c Release
完全支持将两个选项结合在一起,以为您的应用程序获得修剪过的单个组件。