类型存在于2个程序集中

Kou*_*Hal 65 c# com-interop

我从两个不同的第三方COM DLL创建了两个.NET Interop程序集.两个COM DLL都包含一个名为的类型COMMONTYPE.因此,COMMONTYPE现在也通过两个Interop组件暴露.

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

该类型<ABC>存在于<ASSEMBLY1.dll><ASSEMBLY2.dll>

由于COM DLL是由第三方供应商提供的,因此我无法访问源代码,而且我正在编写一个C#Console应用程序,这意味着我没有web.config文件,我可以在其中添加debug=false解决方法.我能做什么?

Tom*_*Tom 138

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

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

在此输入图像描述

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

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

extern alias destination
Run Code Online (Sandbox Code Playgroud)

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

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 对我来说也绝对是最好的答案.其他解决方案甚至不起作用,因为我有两个完全相同的dll,一个只是与ILMerge合并在另一个中.问题解决了 (4认同)
  • 欣赏更好的答案!这显然是别名的基本用途 (2认同)
  • 我进入参考资料,选择由 Nuget 安装的包,然后将别名设置为目标。工作起来就像一个魅力...... (2认同)

Joe*_*ton 12

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

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

...

Vendor1.COMMONTYPE blah = new Vendor1.COMMONTYPE();
Vendor2.COMMONTYPE blah2 = new Vendor2.COMMONTYPE();
Run Code Online (Sandbox Code Playgroud)

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


Zun*_*air 11

旧问题但找到了一个更简单的选项...选择您要使用的引用...在属性下,将别名更改为'xyz'现在在代码行中,在顶部添加:

extern alias xyz;
Run Code Online (Sandbox Code Playgroud)

然后添加使用:

using xyz.VENDOR2.Type;
Run Code Online (Sandbox Code Playgroud)

或其他使用方式:

using OtherNameSpace = xyz.VENDOR2.Type;
Run Code Online (Sandbox Code Playgroud)

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

var abc = new xyz.VENDOR2.Type.abc();
Run Code Online (Sandbox Code Playgroud)

要么

var abc = new OtherNameSpace.abc();
Run Code Online (Sandbox Code Playgroud)

  • 但是,当它被引用的NUGET包而不是常规的dll时,这可以实现吗? (2认同)

Den*_*nis 7

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

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


Tig*_*ran 0

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

希望这可以帮助。