89

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

dll

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

我已经使用了这个服务堆栈的 dll 来使用

JsonServiceClient client = new JsonServiceClient(servicepath);

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

4

7 回答 7

124

你有几个选择:

或者

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

或者

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

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

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

还有一篇文章描述了如何在此处将 ILMerge 包含到您的 VS 项目设置中

于 2011-11-10T11:41:27.317 回答
29

将引用的程序集包含为嵌入式资源的一个很好的工具是CosturaFody插件)。作者 Simon Kropp 是这样描述的:

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

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

特征:

  • 包括调试符号
  • 嵌入式程序集的压缩
  • 包括/排除特定组件
  • 其他(见自述文件
于 2015-09-23T04:56:37.850 回答
7

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

于 2015-06-26T12:48:59.343 回答
3

如果您有 WPF 依赖项,您的选择可能会受到更多限制...... ILMerge 似乎无法处理这些。Costura.Fody(正如上面的 Codefox 所提到的)对我们来说非常有效,并且花了大约 5 分钟才开始......非常好的体验。

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

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

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

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

于 2016-04-13T14:21:42.450 回答
3

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

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

  1. 项目配置:
    <PropertyGroup>
      <RuntimeIdentifier>win10-x64</RuntimeIdentifier>
      <PublishSingleFile>true</PublishSingleFile>
    </PropertyGroup>

    <PropertyGroup>
      <PublishTrimmed>true</PublishTrimmed>
    </PropertyGroup>
  1. 使用命令行:
    dotnet publish -r win10-x64 -p:PublishSingleFile=true
    dotnet publish -r <rid> -c Release

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

于 2019-11-29T14:42:42.887 回答
2

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

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

  • 允许您的服务使用 .NET 的 HTTP 侦听器进行自托管
  • 支持预编译的 Razor 视图
  • 支持嵌入式资源
  • 支持 Sqlite 和 OrmLite 中的嵌入式数据库
  • 可以IL合并成一个.exe
于 2015-06-26T13:12:04.173 回答