office microsoft example application c# com-interop

c# - microsoft - Tipo existe en 2 ensamblajes



microsoft office interop word application c# (5)

He creado dos ensamblados de interoperabilidad .NET a partir de dos DLL COM de terceros diferentes. Ambas DLL COM contenían un tipo llamado COMMONTYPE . Por lo tanto, COMMONTYPE ahora también se expone a través de los dos ensamblajes de interoperabilidad.

Tengo un tercer proyecto que necesita usar estos dos ensamblajes de interoperabilidad y obtengo el infame error de tiempo de compilación:

El tipo <ABC> existe tanto en <ASSEMBLY1.dll> como en <ASSEMBLY2.dll>

Dado que las DLL de COM son proporcionadas por un proveedor externo, no tengo acceso al código fuente y estoy escribiendo una aplicación de Consola C #, lo que significa que no tengo un archivo web.config donde pueda agregar la solución debug=false . ¿Que puedo hacer?


A menos que los espacios de nombres de los proveedores sean idénticos (improbables), las definiciones de tipo serán realmente separadas en ese punto. Lo que deberá hacer (y esto es un PITA completo a veces) es crear un alias de espacio de nombres en su declaración de uso en lugar de simplemente aplicar la carta carta blanca. Esto te permitirá volver a identificar los espacios de nombres:

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

Esto significará usar el alias específico para todos los tipos ubicados en cada espacio de nombres para estos proveedores.


La pregunta anterior, pero encontró una opción más fácil ... Seleccione la referencia que desea usar ... En propiedades, cambie los Alias ​​a ''xyz'' Ahora en la línea de código, en la parte superior agregue:

extern alias xyz;

luego agregue usando:

using xyz.VENDOR2.Type;

u otra forma de usar usando:

using OtherNameSpace = xyz.VENDOR2.Type;

ahora debería poder usar la referencia explícitamente como se muestra a continuación:

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

o

var abc = new OtherNameSpace.abc();


Sé que esto es viejo, pero hay una manera más fácil que la que figura en la lista. Esto funciona cuando hace referencia a dos conjuntos que comparten tipos con exactamente el mismo nombre y espacio de nombres.

Si hace clic con el botón derecho en la referencia a su DLL y selecciona Propeties, verá que aquí hay una propiedad llamada "Alias".

El valor predeterminado es "global" . Para uno de los ensamblajes en conflicto, cambie esto a cualquier otro valor. En el siguiente ejemplo, lo cambié de "global" a "destino".

Luego, en su archivo de código, tendrá que usar la palabra clave externa para usar este alias como el espacio de nombres de nivel raíz para estos tipos. En este ejemplo, colocaría lo siguiente en la parte superior de su archivo .cs:

extern alias destination

Ahora, dentro de este archivo, puede hacer referencia a ambos 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(); } } }


Tal vez pueda engañarlo, cambiando un namespace de namespace de uno de los ensamblajes, en este caso, el nombre completo de un COMMONTYPE no será igual a otro, y posiblemente podría resolver su problema con un conflicto que ocurre en la 3ra DLL.

Espero que esto ayude.


puede usar un alias para los diferentes espacios de nombres y / o tipos:

Así es como se vería:

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