C# 错误2类型<;T>;存在于两者之中。。。与ILMerge
我有3个项目:C# 错误2类型<;T>;存在于两者之中。。。与ILMerge,c#,visual-studio-2013,ilmerge,C#,Visual Studio 2013,Ilmerge,我有3个项目: A_Main项目(启动项目) B_中间项目 C_共享类库 这些依赖性是: A取决于B&C B取决于C C只依赖于系统 每个项目都有自己的名称空间 只要没有安装ILMerge,一切正常 如果为项目A(“A_MainProject”)激活了ILMerge,那么一切仍然正常,并且为项目A生成了一个自包含的可执行文件 如果B_IntermediateProject的ILMerge现在也被激活,则会出现以下错误: Error 2 The type 'C_SharedClassL
- A_Main项目(启动项目)
- B_中间项目
- C_共享类库
Error 2 The type 'C_SharedClassLibrary.SharedClass' exists in both 'c:\dev\ILMergeError\B_IntermediateProject\bin\Debug\B_IntermediateProject.exe' and 'c:\dev\ILMergeError\C_SharedClassLibrary\bin\Debug\C_SharedClassLibrary.dll' C:\dev\ILMergeError\A_MainProject\Program.cs 12 A_MainProject
我使用“MSBuild ILMerge task”1.0.3-rc2和“ILMerge”2.13.0307(来自mbarnett)
最小解决方案包含3个项目,每个项目有一个类。
此版本仅在一个项目上激活了ILMerge,并且可以正常工作:
此版本在项目B上也已激活,并产生错误:
如果我用ILMerge External(ILMergeGUI)合并两个EXE和dll,一切都会正常工作
提前感谢您的回答,
Xan Kun简单的回答是,您应该只在A上启用ILMerge,它将A+B+C合并在一起 出现此错误的原因是,当在B上启用ILMerge时,B也将使用所有C类型重新打包(B'=B+C)。因此,当ILMerge在A上触发时,它将合并A+B'+C=A+(B+C)+C 现在可能发生两种情况:
(它们很讨厌,因为它们并不表示程序集不匹配,而exception只表示“c不能强制转换为c”,这可能会让很多人感到困惑)乍一看,听起来像是名称空间问题。您好,谢谢您的回答。这两天来一直让我心烦意乱。请允许我解释一下,我来自Java背景,包的概念似乎与命名空间有点不同。请你再解释一下,你的确切意思是什么?是否所有类都必须在同一名称空间中?不,它们不必在同一名称空间中,也可以说不应该在同一名称空间中。它们不必在同一名称空间中,但如果您碰巧有一个方法名称,例如Microsoft的一些名称是相同的。Interop例如,word
应用程序
可能会导致所谓的方法冲突,因此您将不得不这样做若要通过方法的类名
方法名来完全限定该方法,这是否有意义,或者因为您在所有3个方法中都有AnotherMessageBox
,您必须通过其名称空间来完全限定该方法,若能在.cs标题中看到一些代码来说明所有3个方法是如何定义的,那个将是一件非常好的事情。对于迟来的回答,我感到非常抱歉,我将准备一份演示问题的示例解决方案。我有了更多的见解,同时也将发布一些信息。嗨!我接受了你的回答,因为它似乎是最正确的。尽管我从未真正弄清问题的根源,但您的第一句话肯定是正确的,如果需要第二个(或更多)exe文件,那么整个buld过程无论如何都需要精心设计,以避免出现这些情况。