ILMerge.Merge: 错误!!:程序集中找到重复的类型

10

我会尽可能简单地解释,如果需要更多信息,请告诉我。我下载了ILMerge来将Newtonsoft.Json.dll合并到我的类库中。我正在使用以下命令从后期构建事件命令行调用ILMerge:

"$(ProjectDir)bin\ILMerge.exe" /internalize:"$(ProjectDir)bin\ILMergeIncludes.txt" /out:"$(TargetDir)$(TargetName).all.dll" "$(TargetDir)$(TargetName).dll" "$(TargetDir)*.dll" /target:library /targetplatform:v4,C:\Windows\Microsoft.NET\Framework64\v4.0.30319 /wildcards

在输出窗口中,它显示:
An exception occurred during merging:
  ILMerge.Merge: ERROR!!: Duplicate type 'myLibrary.some.class' found in assembly 'myLibrary.all'. Do you want to use the /alllowDup option?
     at ILMerging.ILMerge.MergeInAssembly(AssemblyNode a, Boolean makeNonPublic, Boolean targetAssemblyIsComVisible)
     at ILMerging.ILMerge.Merge()
     at ILMerging.ILMerge.Main(String[] args)

问题在于'myLibrary.some.class'并不是重复的。
我已经在互联网上寻找线索很久了,但我找到的只有以下两个链接,以及一些网络应用程序的情况,人们复制/粘贴页面时忘记更改类名。 类似的问题,但解决方案似乎不相关 同样的求助声,但没有答案 我尝试使用allowDup选项,但在合并后的dll中,它将'myLibrary.some.class'变成'myLibrary.some.random125624.class'。然后我尝试使用allowDup传递'class',但是我会得到“重复类型”错误,然后是'class2',然后是'class3',然后是'class4'...似乎没有重复类型的数量限制!
我确定这些类不是重复的,因为命名空间非常特定于我的公司和项目。
有人能帮忙吗?

我已经决定使用ILMerge并不是一个好主意。抱歉,同事,但你只能接受多个dll的存在。 - Dean
你提供的链接“类似问题但解决方案似乎不相关”的帮助对我很有帮助。在合并时,将-fixednames参数传递给aspnet_compiler让我成功解决了这个问题。 - eric1825
3个回答

2

在命令行中,您告诉ILMerge使用一个库两次。
ILMerge将目标文件夹中的所有dll文件与"$(TargetDir)*.dll" /wildcards一起使用,并再次添加文件"$(TargetDir)$(TargetName).dll"

因此,解决方案非常简单。尝试使用以下命令行:
"$(ProjectDir)bin\ILMerge.exe" /internalize:"$(ProjectDir)bin\ILMergeIncludes.txt" /out:"$(TargetDir)$(TargetName).all.dll" "$(TargetDir)*.dll" /target:library /targetplatform:v4,C:\Windows\Microsoft.NET\Framework64\v4.0.30319 /wildcards


谢谢!我确实遇到了类似的问题,你的评论让我意识到并解决了它! - KoalaBear

1

我遇到了同样的问题,使用Fody (https://github.com/Fody/Costura)解决了我的问题。

确保正确设置以在构建后删除所有不必要的文件(创建干净输出目录部分),然后您将拥有单个dll或exe。

希望能帮到你!


0

我知道这是一个古老的问题,但对于我来说,这是谷歌返回的第一个错误。

现在,对于我来说,便宜而肮脏的解决方案就是在命令行选项中简单地添加“/union”。


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