用于在单个程序集中捆绑 .NET 程序集的软件

软件推荐 视窗 软件开发 。网
2021-10-30 03:41:30

假设我有一个依赖于各种第三方 .NET DLL的 .NET/CLR 程序Hello.exe(或 DLL )。Hello.dll我想发布一个文件,而不提供实际的“安装程序”,所以我正在寻找一些可以将所有依赖项打包到可执行文件中的软件,然后在我的任何代码开始运行之前加载它们。

我还需要它无条件地加载提供的每个 DLL,不仅是“按需”,因为 DLL 中的某些类型是通过反射访问的,因此类加载器永远不会尝试显式加载 DLL 并因此调用类加载器钩子。如果可以在没有我自己的任何代码的情况下执行此操作,我不想将代码添加到我的可执行文件中。

我正在使用 SharpDevelop 和 .NET Framework 4.0 Full Profile,但这个问题的理想解决方案将是与 IDE 无关的,并且可以使用 .NET 3.0 或更高版本(2.0 会更好,但我们不要贪婪......)

3个回答

ILMerge怎么样它已经存在了很长时间,并且有很多资源。例如,这里有一个快速介绍此外,stackoverflow 问题已经涵盖了一些常见的陷阱,例如Merging DLL with EXE

它也独立于您的构建环境。您只需要将其嵌入到您的构建过程中。

遗憾的是,ILMerge 并不完美。例如,它不支持合并 WPF 程序集。另一种方法是将库作为资源嵌入并动态加载它们。例如看这篇博文allquixotic 提到的 LibZ Container 基本上就是这样做的。

对于 LibZ 容器,还有另一种选择,一种已经过尝试并且我会认真考虑的方法:Fody.Costura

Mono mkbundle可能是另一种选择,但请注意它会生成本机代码。依赖关系可以静态链接。在 Windows 上,它还需要 cygwin 才能运行(另见此论坛帖子

LibZ Container使用从资源文件中解压缩压缩的程序集资源并从内存中加载它们的代码来检测您的主程序集。它声称可以使用反射代码以及强名称,并且它不会以任何方式修改原始程序集文件,因此强名称引用可以正常工作。

il-repack部分满足答案的标准,但不幸的是,它重新打包了程序集,这破坏了它们的强名称,所以如果你依赖于用强名称签名的程序集,这将不起作用。在类加载程序集之前,它也不适用于大多数反射代码。