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

Posted

技术标签:

【中文标题】如何将多个程序集合并为一个?【英文标题】:How to merge multiple assemblies into one? 【发布时间】:2011-12-26 00:40:15 【问题描述】:

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

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

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

JsonServiceClient client = new JsonServiceClient(servicepath);

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

【问题讨论】:

【参考方案1】:

您有多种选择:

使用ILMerge(免费) 如何查看here 和here

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

code that yourself in less than 10 lines(免费但最小的源代码更改) 将所有需要的依赖项标记为“嵌入式资源” - 这样它们就包含在 EXE 文件中......您需要设置一个 AssemblyResolve 处理程序,该处理程序在运行时从资源读取并将所需的 DLL 返回给 .NET 运行时......

【讨论】:

感谢您提醒我 Jeffrey Richter 的嵌入程序集解决方案!请参阅我的回答提到 Costura 以获取将其与注入必要代码相结合的工具。 继续使用 .NET 5.0,ILRepack 是 ILMerge 的替代品。【参考方案2】:

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。

特点:

包括调试符号 嵌入式程序集的压缩 包括/排除特定程序集 其他(见Readme)

【讨论】:

OMG Costura.Fody 是正确的答案。从 nuget 安装包,重建项目,现在我有一个独立的 EXE 太棒了!! 我无法相信它是多么容易。只需从 nuget 安装软件包即可。 我也在使用 Costura.Fody。将 NuGet 包作为资源包含在内很简单,而且非常容易。获取项目。 @user3700562,此技术不会创建新的程序集,而是将一个或多个引用的程序集嵌入到现有程序集中。 很好的解决方案!我用了一年,没有任何问题。但请注意,它仅包括您的***项目引用的程序集。如果您的应用引用了另一个引用第三方程序集的项目,您需要将其添加到您的***项目中。【参考方案3】:

您要查找的工具名为 ILMerge 。 它是一个命令行工具,可以这样使用:

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

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

【讨论】:

嗨,我可以将外部资源(文件/图像)添加到可执行文件中吗? @EmdadulSawon 也许您可以将它们作为资源包含在您的某个库中?【参考方案4】:

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

【讨论】:

太棒了!对我来说效果很好! Codeplex 正在关闭,所以这里是移动的项目链接:bitbucket.org/wvd-vegt/ilmergegui【参考方案5】:

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

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

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

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

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

【讨论】:

【参考方案6】:

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

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

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

    <PropertyGroup>
      <PublishTrimmed>true</PublishTrimmed>
    </PropertyGroup>
    使用 CLI:
    dotnet publish -r win10-x64 -p:PublishSingleFile=true
    dotnet publish -r <rid> -c Release

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

【讨论】:

这不给你一个单独的组件。它只是将您的文件压缩到一个 zip 存档中,然后在您尝试运行应用程序时将其解压缩到用户文件夹中。【参考方案7】:

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

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

允许您的服务使用 .NET 的 HTTP 侦听器自托管 支持预编译的 Razor 视图 支持嵌入式资源 支持 Sqlite 和 OrmLite 中的嵌入式数据库 可以ILM合并成一个.exe

【讨论】:

以上是关于如何将多个程序集合并为一个?的主要内容,如果未能解决你的问题,请参考以下文章

在 .NET 程序集中内部化类和方法

无法使用“加入数据”将多个数据集合并为一个使用 Azure 机器学习工作室设计器

将来自不同模型的两个查询集合并为一个查询集

如何跟踪程序集的多个版本?

如何将非托管 dll 和托管程序集合并到一个文件中?

将属性文件与 Maven 程序集合并