说我有一个依赖于各种第三方.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可能更好,但是请不要贪婪...)

评论

您可以将程序集打包到一个文件中,然后在应用程序加载时将它们放到临时目录中以进行可能的加载,然后使用Assembly.LoadFrom进行实际工作?

这些第三方DLL是托管的还是本地的?您是否还需要打包.NET框架,即在不安装.NET的情况下运行您的应用?

不,我不需要安装.NET Framework即可运行该应用程序。第三方DLL主要是纯.NET程序集,但有些是本机的。

#1 楼

ILMerge呢?它已经存在很长时间了,并且有很多资源。例如,这是一个快速介绍。
它也独立于您的构建环境。您只需要将其嵌入到构建过程中即可。

ILMerge并不完美。例如,它不支持WPF程序集的合并。
替代方法是将库作为资源嵌入并动态加载它们。例如,请参阅此博客文章。
allquixotic提到的LibZ容器基本上就是这样做的。 br /> Mono mkbundle可能是另一种选择,但是请注意,它会生成本机代码。依赖关系可以静态链接。在Windows上,还需要cygwin才能运行(另请参阅此论坛主题)

#2 楼

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

评论


您能否详细说明一下此工具?在您的建议中增加一些个人经验?易于配置/使用吗?也许添加一个例子?

–安吉洛·福克斯(Angelo Fuchs)
2014年2月9日在19:36

#3 楼

il-repack部分满足了答案的标准,但不幸的是它重新打包了程序集,从而破坏了它们的强名称,因此,如果您依赖以强名称签名的程序集,则将无法正常工作。它也不适用于大多数反射代码,直到将程序集装入类之后。

评论


您能否详细说明一下此工具?在您的建议中增加一些个人经验?易于配置/使用吗?也许添加一个例子?

–安吉洛·福克斯(Angelo Fuchs)
2014年2月9日在19:36