Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 错误2类型<;T>;存在于两者之中。。。与ILMerge_C#_Visual Studio 2013_Ilmerge - Fatal编程技术网

C# 错误2类型<;T>;存在于两者之中。。。与ILMerge

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

我有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_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

现在可能发生两种情况:

  • B在内部使用C,并且不(公开)公开任何C类型(例如,作为方法参数或返回值)。 在这种情况下,您可以通过ILMerge选项(/internalize on B和/allowDup on A)使其工作,尽管合并程序集中的每个C类型最终都会出现两次

  • B公开C类型,A可能使用这些类型。 在这种情况下,即使您设法使合并工作,它也会在运行时失败,因为A和B'引用了不同的类型(例如,对于类c,B'引用了B'.c和A引用了c.c),并且您会得到令人讨厌的类型转换异常,因为这是两种不同的类型(相同的名称、相同的命名空间,但不同的程序集)


  • (它们很讨厌,因为它们并不表示程序集不匹配,而exception只表示“c不能强制转换为c”,这可能会让很多人感到困惑)

    乍一看,听起来像是名称空间问题。您好,谢谢您的回答。这两天来一直让我心烦意乱。请允许我解释一下,我来自Java背景,包的概念似乎与命名空间有点不同。请你再解释一下,你的确切意思是什么?是否所有类都必须在同一名称空间中?不,它们不必在同一名称空间中,也可以说不应该在同一名称空间中。它们不必在同一名称空间中,但如果您碰巧有一个方法名称,例如Microsoft的一些名称是相同的。Interop例如,word
    应用程序
    可能会导致所谓的方法冲突,因此您将不得不这样做若要通过方法的类名
    方法名来完全限定该方法,这是否有意义,或者因为您在所有3个方法中都有
    AnotherMessageBox
    ,您必须通过其名称空间来完全限定该方法,若能在.cs标题中看到一些代码来说明所有3个方法是如何定义的,那个将是一件非常好的事情。对于迟来的回答,我感到非常抱歉,我将准备一份演示问题的示例解决方案。我有了更多的见解,同时也将发布一些信息。嗨!我接受了你的回答,因为它似乎是最正确的。尽管我从未真正弄清问题的根源,但您的第一句话肯定是正确的,如果需要第二个(或更多)exe文件,那么整个buld过程无论如何都需要精心设计,以避免出现这些情况。