首页 > 解决方案 > ILMerge 无法合并:程序集“xxx”未正确合并

问题描述

问题

使用 ILMerge 我正在尝试合并三个程序集:A、B 和 C。它失败并显示以下错误消息。我真的需要帮助解决这个问题。

“ILMerge.Merge:程序集 'B' 未正确合并。它仍列为目标程序集中的外部引用。”

程序集 A 不引用其他两个。B 引用 A。C 引用 A 和 B。

命令行:ilmerge /v2 /target:library /out:test.dll a.dll b.dll c.dll

我试过的

一些背景

该项目大于三个程序集,但我已设法将问题减少到这些。如果我不包括程序集 C 并且只合并 A 和 B,问题就会消失。

在以前的版本中,我没有这个问题。在这两个版本之间只有非功能性变化,比如重命名(不是程序集或命名空间,只有类、方法等)和访问修饰符的重新排序(静态内部->内部静态)

从文档

一个常见问题是,在合并某些程序集后,您会收到一条错误消息,指出输入程序集未正确合并,因为它仍列为合并程序集中的外部引用。此问题的最常见原因是其中一个输入程序集 B 具有对错误合并程序集 A 的外部引用,以及对另一个程序集 C 的外部引用,该程序集 C 本身具有对 A 的外部引用。假设对 C 的引用指向一个方法,该方法接受其类型在 A 中定义的参数。然后,即使在合并的程序集中,对 C 中方法的方法调用的类型签名仍然引用来自 A 的类型。毕竟,ILMerge 不能去修改程序集 C,以便它现在取决于类型,因为它在合并后在输出程序集中定义!解决方案是使用 closed 选项(第 2.6 节)让 ILMerge 计算输入程序集的传递闭包,以防止这种“悬空引用”。在示例中,这将导致所有三个程序集 A、B 和 C 被合并。如果没有对 A 的外部引用,就无法仅合并 A 和 B。

标签: ilmerge

解决方案


推荐阅读