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

Aru*_*ana 82 c# ilmerge assemblies exe servicestack

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

dll文件

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

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

JsonServiceClient client = new JsonServiceClient(servicepath);
Run Code Online (Sandbox Code Playgroud)

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

Yah*_*hia 117

你有几个选择:

要么

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

要么

  • 你自己在不到10行(自由但最小的源代码更改)的代码
    将所有需要的依赖项标记为"嵌入式资源" - 这样它们就包含在EXE文件中...你需要设置一个AssemblyResolve处理程序,它在运行时从资源中读取并将所需的DLL返回给.NET运行时...

  • 感谢您提醒我Jeffrey Richter的嵌入式组件解决方案!请参阅我的回答,提及[Costura](https://github.com/Fody/Costura/),找到一个结合注入必要代码的工具. (4认同)

yas*_*891 29

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

ilmerge /target:winexe /out:MyApp.exe 
        MyExe.exe ServiceStack.dll ServiceStack.Interfaces.dll ServiceStack.ServiceInterface.dll  ServiceStack.Text.dll
Run Code Online (Sandbox Code Playgroud)

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


Cod*_*Fox 23

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

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

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

特征:

  • 包括调试符号
  • 压缩嵌入式组件
  • 包括/排除特定组件
  • 其他(见自述)

  • OMG Costura.Fody是正确的答案.从nuget安装包,重建项目,现在我有一个独立的EXE真棒! (9认同)
  • 我简直不敢相信它是多么容易.只需从nuget安装软件包即可. (4认同)
  • 我也在使用Costura.Fody.设置和死亡很容易将NuGet包作为资源包含在内.获得项目. (2认同)

Pri*_*tam 7

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

  • 太棒了!对我来说很棒! (2认同)

rex*_*all 5

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

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

它合并所有标记为“Copy Local”= true 的 DLL,并生成一个合并的 .EXE(与标准输出一起,其中大部分现在不再需要),该文件也被压缩。然后可以独立使用。

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

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


Tan*_*dar 5

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

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

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

    <PropertyGroup>
      <PublishTrimmed>true</PublishTrimmed>
    </PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
  1. 使用 CLI:
    dotnet publish -r win10-x64 -p:PublishSingleFile=true
    dotnet publish -r <rid> -c Release
Run Code Online (Sandbox Code Playgroud)

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

  • 这并不意味着您是单个组件。它只是将您的文件压缩到 zip 存档中,然后在您尝试运行应用程序时将其解压到用户文件夹中。 (2认同)