Tipo existe em 2 montagens

Eu criei dois assemblies de interoperabilidade do .NET de duas DLLs de terceiros diferentes. Ambas as DLLs COM continham um tipo chamado COMMONTYPE . Portanto, COMMONTYPE agora é exposto através dos dois assemblies Interop também.

Eu tenho um terceiro projeto que precisa usar esses dois assemblies de interoperabilidade e recebo o erro de tempo de compilation infame:

O tipo existe em e

Como as DLLs COM são fornecidas por um fornecedor de terceiros, não tenho access ao código-fonte e estou escrevendo um aplicativo C # Console, o que significa que não tenho um arquivo web.config no qual eu possa adicionar a solução debug=false . O que eu posso fazer?

Eu sei que isso é antigo, mas há uma maneira mais fácil do que a listada. Isso funciona quando você faz referência a dois conjuntos que compartilham tipos com o mesmo nome e espaço de nomes.

Se você clicar com o botão direito do mouse na referência à sua DLL e selecionar Propeties, verá que aqui está uma propriedade chamada “Aliases”.

insira a descrição da imagem aqui

O valor padrão é “global” . Para uma das assembléias conflitantes, altere isso para qualquer outro valor. No exemplo abaixo, mudei de “global” para “destino”.

Em seguida, no seu arquivo de código, você terá que usar a palavra – chave externa para usar esse alias como o namespace de nível raiz para esses tipos. Neste exemplo, você colocaria o seguinte na parte superior do seu arquivo .cs:

 extern alias destination 

Agora, dentro desse arquivo, você pode referenciar os dois tipos.

 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(); } } } 

A menos que os namespaces dos fornecedores sejam idênticos (improváveis), as definições de tipo serão realmente separadas nesse ponto. O que você precisa fazer (e isso é um PITA completo às vezes) é criar um alias de espaço para nome em sua declaração usando em vez de simplesmente aplicar a declaração carta branca. Isso permitirá que você reidentifique os namespaces:

 using Vendor1 = Vendor.Namespace; using Vendor2 = OtherVendor.Namespace; ... Vendor1.COMMONTYPE blah = new Vendor1.COMMONTYPE(); Vendor2.COMMONTYPE blah2 = new Vendor2.COMMONTYPE(); 

Isso significará usar o alias específico para todos os tipos localizados em cada namespace desses fornecedores.

Pergunta antiga, mas encontrou uma opção mais fácil … Selecione a referência que você deseja usar … Em propriedades, altere os aliases para ‘xyz’ Agora na linha de código, na parte superior, adicione:

 extern alias xyz; 

em seguida, adicione usando:

 using xyz.VENDOR2.Type; 

ou outra maneira de usar usando:

 using OtherNameSpace = xyz.VENDOR2.Type; 

agora você deve poder usar a referência explicitamente como abaixo:

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

ou

 var abc = new OtherNameSpace.abc(); 

você pode usar aliases para os diferentes namespaces e / ou tipos:

aqui está como seria:

 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(); ab = new a(); } } } namespace sssssss { public class a { public string ff { get; set; } } } 

MSDN

Talvez você possa enganá-lo, alterando um namespace de um dos assemblies, nesse caso, o nome totalmente qualificado de um COMMONTYPE não será igual a outro, e possivelmente ele poderá resolver seu problema com o conflito que ocorre na 3ª DLL.

Espero que isto ajude.