ilmerge - 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
我试过的
- 使用 /close 参数。没有任何区别。
- 不同版本的 ILMerge,我在 3.0.21.3911 和 2.14.1208 版本中都遇到相同的错误。
- 先合并 A 和 B,然后在 C 中合并 A+B 合并。这不会产生任何错误消息,但生成的文件已损坏。它没有运行,当我通过 .NET Obfuscator 运行时,它会抱怨它。
一些背景
该项目大于三个程序集,但我已设法将问题减少到这些。如果我不包括程序集 C 并且只合并 A 和 B,问题就会消失。
在以前的版本中,我没有这个问题。在这两个版本之间只有非功能性变化,比如重命名(不是程序集或命名空间,只有类、方法等)和访问修饰符的重新排序(静态内部->内部静态)
从文档
一个常见问题是,在合并某些程序集后,您会收到一条错误消息,指出输入程序集未正确合并,因为它仍列为合并程序集中的外部引用。此问题的最常见原因是其中一个输入程序集 B 具有对错误合并程序集 A 的外部引用,以及对另一个程序集 C 的外部引用,该程序集 C 本身具有对 A 的外部引用。假设对 C 的引用指向一个方法,该方法接受其类型在 A 中定义的参数。然后,即使在合并的程序集中,对 C 中方法的方法调用的类型签名仍然引用来自 A 的类型。毕竟,ILMerge 不能去修改程序集 C,以便它现在取决于类型,因为它在合并后在输出程序集中定义!解决方案是使用 closed 选项(第 2.6 节)让 ILMerge 计算输入程序集的传递闭包,以防止这种“悬空引用”。在示例中,这将导致所有三个程序集 A、B 和 C 被合并。如果没有对 A 的外部引用,就无法仅合并 A 和 B。
解决方案
推荐阅读
- javascript - 将反应虚拟化表从 javascript 转换为 typescript - 类型问题
- lua - 如何使用 pandoc 与 lua-filters 对齐文本?
- python - 在发送 Python smtplib 之前检查电子邮件的完整大小
- python - 如何在python列表中找到除0之外的任何数字的第一个索引?
- php - 如何在 Laravel Blade @each 中获得迭代值?
- minikube - 节点容器无法从 minikube 但从本地机器连接到 atlas 集群
- asp.net - 适用于 Google Chrome 和 Edge 的 Windows Kerberos 身份验证
- amazon-web-services - 在 AWS 架构中限制外部 API 调用
- xamarin.forms - 从左方向进行页面导航
- android - Firebase 通知使我的应用程序在前台崩溃