2010-06-10 14 views
29

Estoy en el proceso de migrar una biblioteca que está escrita en C++ y tiene un contenedor C#. El C# envoltorio (LibWrapper) tiene un conjunto de clases con espacios de nombres, como:Clase con el mismo nombre en dos conjuntos (intencionalmente)

namespace MyNamespace 
    class MyClass 
    class MyOtherClass 

Mi nueva biblioteca, LibraryCS contiene los mismos espacios de nombres y nombres de clases como LibWrapper (por requerimiento del usuario), por lo que también tengo:

namespace MyNamespace 
    class MyClass 
    class MyOtherClass 

Ahora que la migración ha finalizado, estoy en proceso de crear una prueba que compare los resultados del uso de ambas bibliotecas para validar la migración. Sin embargo, cuando trato de hacer referencia a MyNamespace.MyClass obtengo un error de compilación (¡esperemos!) Que diga "MyNamespace.MyClass está definido tanto en LibWrapper como en LibraryCS".

¿Hay algún truco sobre este problema, que me permita usar dos clases con el mismo nombre pero de diferentes ensamblajes en el mismo código de cliente?

Alternativamente, ¿hay alguna otra manera de probar esto?

Renombrar el espacio de nombre migrado a algo como MyNamespace2, por supuesto, funcionará, pero se nos pidió que no lo hagamos, a fin de que el código del cliente sea más fácil de migrar.

+0

¿Estaría bien escribir un contenedor sobre una de las clases que existe en otro espacio de nombres? – Goblin

+0

Si puedo ejecutar ambos en el mismo código de prueba, puede ser aceptable. Será una envoltura solo utilizada para fines de prueba. – pgb

Respuesta

54

Puede utilizar un extern alias hacer referencia a tipos con el mismo nombre completamente calificado de diferentes montajes. Seleccione la referencia a LibraryCS y actualice los Alias ​​en la página de propiedades de "global" a "LibraryCS", y agregue extern alias LibraryCS; a la parte superior de su archivo fuente, y luego puede usar LibraryCS::MyNamespace.MyClass para referirse a la clase en LibraryCS. Puede usar MyNamespace.MyClass o global::MyNamespace.MyClass para referirse a la clase en LibWrapper, o puede usar un alias para esa referencia también.

+4

Estoy de acuerdo con Quartermeister. Consulte a continuación para obtener más información: http://blogs.msdn.com/b/ansonh/archive/2006/09/27/774692.aspx – Kari

0

Puede cargar el primer ensamblaje en el tiempo de ejecución y luego usar el reflejo para crear una instancia y ejecutar su método. A continuación, descargue ese conjunto, cargue el segundo conjunto y utilice la reflexión para crearlo y ejecutar sus métodos.

Probablemente sería más fácil de usar 2 procesos separados luego comparar la salida resultante ...

+1

No puede descargar un ensamblado directamente, solo un dominio de aplicación. Para hacer esto, necesita un dominio de aplicación separado con ese ensamblaje. –

+0

Buena llamada, tendría que quitar el AppDomain para descargar el conjunto, editaré la respuesta. –

1

Vi esta pregunta y respuesta y me ayudó. Sin embargo, para aquellos que necesitan una explicación detallada sobre el mismo, encontré un link que es realmente útil.

Extracto del enlace.

Uso de diferentes versiones de la misma DLL en una aplicación

paso 1: usando el VS IDE. Agregue la referencia a ambos dlls en su solución de aplicación cliente. Luego, en el Explorador de soluciones debajo del nodo de referencia, seleccione la primera biblioteca de clases (versión anterior).En la ventana de propiedades, cambie el campo Alias ​​desde global hasta anteriorVer. lly, nuevoVer para N versión de jarra.

Paso 2: usar el siguiente código como los primeros estados donde va a hacer referencia a ella

extern alias oldVer; 
extern alias newVer; 

ahora a utilizar,

Console.WriteLine(oldVer::MyLibrary.MyClass.method()); 
Console.WriteLine(newVer::MyLibrary.MyClass.method()); 

Espero que esto ayude.

Cuestiones relacionadas