ILMerge - 使用通配符并指定主程序集

问题描述

我有主程序集 MyAssembly.dll 和许多我想合并到主程序集的库。因为它们很多,所以我想使用通配符将它们全部包含在内,如下所示:

ILMerge.exe /wildcard /allowDup /out:MyAssembly.Merged.dll MyAssembly.dll *.dll

这种方法的问题在于它合并了 MyAssembly.dll 两次,导致类型名称重复,因此需要使用 /allowDup 选项。但是这个选项会重命名重复的类型,我不希望这样(我的 DLL 是其他应用程序的插件,所有类型都必须具有原始名称)。 我可以在命令行中省略 MyAssembly.dll,但是因为 ILMerge 按字母顺序合并程序集,它将第一个程序集视为主程序集(例如 Autofac.dll),这导致最终程序集具有错误的元数据(版本等) . 是否可以使用通配符选项排除某些程序集名称

解决方法

是否可以使用通配符选项排除某些程序集名称?

没有。您可以编写一个批处理文件来构建命令行,例如使用 for。您也可以用另一种语言编写脚本。

然而,ilmerge 是过去的产物,它有很多问题。由于它将代码复制到一个程序集中,因此它改变了运行时加载的工作方式,这很容易破坏 WPF 或 ASP.NET Core 等延迟加载程序。

现在我们有 .Net5,它为单程序集二进制文件提供一流的支持,无论是在已安装的环境下运行(如您过去需要的程序集)还是独立的(它也包括 .net5 运行时)。它不会将代码混合成一个程序集,而是坚持将运行时加载的程序集直接与生成的大型“程序集”分开,因此您的实际代码不会改变。