类型存在于2个程序集中

时间:2012-02-08 13:44:49

标签: c# com-interop

我已经从两个不同的第三方COM DLL创建了两个.NET Interop程序集。两个COM DLL都包含名为COMMONTYPE的类型。因此,COMMONTYPE现在也通过两个Interop程序集公开。

我有第三个需要使用这两个Interop程序集的项目,我得到了臭名昭着的编译时错误:

  

<ABC><ASSEMBLY1.dll>

中都存在<ASSEMBLY2.dll>类型

由于COM DLL是由第三方供应商提供的,我无法访问源代码,而且我正在编写一个C#Console应用程序,这意味着我没有web.config文件,我可以在其中添加{ {1}}解决方法。我该怎么办?

6 个答案:

答案 0 :(得分:120)

我知道这是旧的,但比列出的方法更简单。当您引用与完全相同名称和命名空间共享类型的两个程序集时,此方法有效。

如果您右键单击对DLL的引用并选择Propeties,您将看到这是一个名为“Aliases”的属性

enter image description here

默认值为“global”。对于其中一个冲突的程序集,将其更改为任何其他值。在下面的示例中,我将其从“全局”更改为“目标”。

接下来,在您的代码文件中,您必须使用extern keyword将此别名用作这些类型的根级命名空间。在此示例中,您可以将以下内容放在.cs文件的顶部:

extern alias destination

现在,在此文件中,您可以引用这两种类型。

extern alias destination;
namespace Test
{
    public static class TestClass
    {
        public static void Success()
        {
            var foo = destination::Some.Duplicate.Namespace.SomeDuplicateType();
            var bar = Some.Duplicate.Namespace.SomeDuplicateType();
        }
    }
}

答案 1 :(得分:11)

除非供应商的名称空间相同(不太可能),否则类型定义在这一点上实际上是分开的。您需要做的事情(有时候这是一个完整的PITA)是在您的using语句中创建命名空间别名,而不是简单地应用语句carte blanche。这将允许您重新标识名称空间:

using Vendor1 = Vendor.Namespace;
using Vendor2 = OtherVendor.Namespace;

...

Vendor1.COMMONTYPE blah = new Vendor1.COMMONTYPE();
Vendor2.COMMONTYPE blah2 = new Vendor2.COMMONTYPE();

这将意味着为这些供应商的每个命名空间中的所有类型使用特定别名。

答案 2 :(得分:11)

老问题但发现了一个更容易的选择...... 选择您要使用的参考... 在属性下,将别名更改为&#39; xyz&#39; 现在在代码行中,在顶部添加:

extern alias xyz;

然后使用:

添加
using xyz.VENDOR2.Type;

或使用其他方式:

using OtherNameSpace = xyz.VENDOR2.Type;

现在你应该能够明确地使用引用,如下所示:

var abc = new xyz.VENDOR2.Type.abc();

var abc = new OtherNameSpace.abc();

答案 3 :(得分:1)

您可以将别名用于不同的名称空间和/或类型:

这是它的样子:

using other = sssssss.a;
namespace ConsoleApplication1
{
    public class a 
    {
        public string ff { get; set; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            other s = new other();
            a b = new a();
        }
    }
}
namespace sssssss 
{

    public class a
    {
        public string ff { get; set; }
    }
}

MSDN

答案 4 :(得分:0)

也许你可以通过更改其中一个程序集的namespace来欺骗它,在这种情况下,一个COMMONTYPE的完全限定名称将不等于另一个,并且可能它可以解决第3个DLL中发生冲突的问题。

希望这有帮助。

答案 5 :(得分:0)

我知道这很旧,但最近遇到了这个问题。我发现解决此问题的最佳方法是通过添加以下内容来修改YourProjectName.csproj文件:

<Target Name="ChangeAliasesOfStrongNameAssemblies" BeforeTargets="FindReferenceAssembliesForReferences;ResolveReferences">
    <ItemGroup>
        <ReferencePath Condition="'%(FileName)' == 'Namespace.You.Want.To.Alias'">
            <Aliases>NewAliasForNamespace</Aliases>
        </ReferencePath>
    </ItemGroup>
</Target>