ILMerge DLL:程序集未正确合并,仍列为外部引用。

44
在一个.NET C#工具的构建过程中,我一直使用ILMerge将程序集合并为单个exe文件。
最近我添加了一个新的类库,现在ILMerge合并失败了。我记得要告诉它合并新的DLL!但现在它报了一个我不太理解的错误:
ILMerge.Merge:程序集'DataObjects'没有正确合并。在目标程序集中,它仍然被列为外部引用。
我所有的程序集引用都是使用“项目引用”完成的,并且过去从未出现过这样的错误。请有经验的大佬们帮忙解释一下这个错误或建议一种解决方法吗?

它是否告诉您源程序集?或者您可以使用 .Net 反编译器找到它吗? - Jason D
这只是输出上面的那一行。 我正在尝试合并的一些程序集引用了“DataObjects”程序集,但这种情况已经持续了一段时间,只有在添加一个新的引用它的程序集时才会出现上述错误。 - Fiona - myaccessible.website
1
你找到这个问题的解决方案了吗? - loraderon
1
是的,请看我的回答 - 希望能帮到你! - Fiona - myaccessible.website
6个回答

41

我不得不使用 /closed 参数。 根据官方文档

Closed

在调用 Merge 方法之前设置此参数,然后计算输入程序集的 "传递闭包(transitive closure)" 并将其添加到输入程序集列表中。如果一个程序集与最初指定的任何输入程序集具有引用关系(直接或间接),并且它对其中一个输入程序集或具有这种引用关系的程序集之一具有外部引用关系,则认为它属于传递闭包的一部分。虽然很复杂,但这就是生活...


4
为了补充一些背景信息,将/closed开关添加到ilmerge命令中可能会“起作用”,但潜在问题是存在一个(或多个)未合并的程序集,其中包含对您试图消除的某个东西的直接引用。您可能希望检查是否有意这样做,然后可能需要显式将该程序集添加到合并操作中 - 或者如果没有必要,可以摆脱该引用,以避免日后混淆... - saminpa

8

当我尝试发布将所有输出合并为单个程序集的Web应用程序时,遇到了类似的错误信息:

合并程序集时发生错误:ILMerge.Merge:目标程序集将自身列为外部引用。

如果您要合并的程序集名称与位于属性 > 应用程序下的Web应用程序的程序集名称相匹配,则会发生此情况。更改输出程序集名称应该可以解决这个问题。


1

这是@HughJeffner的回答转换成的图片。我花了一些时间和尝试才能复制这些指示。

Locations of the fields that should NOT be identical.


这是 VS2022 吗? - Smith

1

我遇到了这个错误,它指向了我正在合并到单个dll中的Microsoft.Xrm.Sdk引用。当我设置另一个引用Microsoft.Xrm.Sdk.Deployment也合并到dll中时,问题得到了解决。有趣的是,在另一个项目中,我将第一个引用合并而第二个部署dll不合并,但它没有报错。


0
在发布项目时,从配置中选择“不合并”,然后再发布。

0

我在合併並部署 Dynamics CRM 插件 dll 的上下文中得到了關於 System.Memory.dll 的錯誤,這很奇怪。

實際上,我忽略了這個錯誤,並且部署了我的合併 DLL... 相信 Dynamics CRM 的插件上下文在部署時會提供它。

儘管有關 System.Memory.dll 的錯誤,MergedPlugin.dll仍然被構建。所以我只需將插件部署到 CRM 上,它就可以運行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接