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

ILMerge - use wildcard and specify main assembly

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

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

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

Is it possible to exclude certain assembly name with wildcard option?

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

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

如今,我们拥有 .Net5,它首先提供 class 对单个程序集二进制文件的支持,既 运行 在已安装环境下(就像您的程序集过去需要的那样)或独立的 (它还包括 .net5 运行time)。它不会将代码混合到一个程序集中,它坚持在 运行 时间直接从您生成的大型“程序集”中加载的单独程序集,因此您的实际代码不会改变。