2010-09-09 31 views
47

Tengo dos archivos DLL que tienen el mismo espacio de nombres pero tienen diferentes funciones y tipos. ¿cómo puedo hacer referencia a ambas DLL en mi proyecto y usar sus funciones y tipos?dos DLL diferentes con el mismo espacio de nombres

por cierto. estas dos DLL tienen algunas funciones y tipos con el mismo nombre y diferente implementación y algunas funciones y tipos únicos

+0

La primera pregunta que viene a la mente es ¿por qué estás creando 2 dll diferente para mismo espacio de nombres? – Searock

+1

Podría estar tratando de usar dos que pasaron a usar el mismo espacio de nombres. – palswim

+0

No lo estoy creando. Estoy escribiendo un programa que debería usar 2 DLL que no puedo cambiar porque son estables en sus empresas. Desafortunadamente ambos tienen el mismo nombre de archivo y el mismo espacio de nombres. –

Respuesta

72

No hay nada especial que deba hacer, simplemente haga referencia a ellos y use los tipos. Los espacios de nombres pueden abarcar varios ensamblajes sin problemas, porque en realidad no son tipos opacos. Un espacio de nombres es solo una forma de agregar un prefijo común a todos los tipos que contiene, lo que le permite tener múltiples tipos del mismo nombre en diferentes espacios de nombres. (El marco no los ve como que tienen los mismos nombres, porque ve el nombre "totalmente calificado" de todo, que tiene un alias y un espacio de nombres adjuntos al frente).

En el raro caso de que hace referencia a 2 ensamblados que tienen los mismos nombres de tipo y los mismos espacios de nombres (como 2 versiones diferentes de la misma dll); puede distinguir qué ensamblaje usar para un tipo determinado utilizando un alias. El alias predeterminado para todas las referencias es global, pero puede especificar su propio alias para cualquier ensamblado cuando lo referencia (utilizando un compilador, o simplemente use el cuadro de propiedades en Visual Studio) y tenga una cláusula extern alias <name> en la parte superior de su archivo de código donde vaya a utilizarlo - usted podrá acceder a los tipos de diferentes montajes con <name>::MyNamespace.Type

+13

Puede leer sobre 'extern alias' aquí: http://msdn.microsoft.com/en-us/library/ms173212.aspx – porges

4

se puede utilizar la función de alias del/de referencia (Importar metadatos) (compilador de C# Opciones) opción del compilador para resolver sus problemas, leídos desde here para obtener más detalles

10

Si tiene 2 tipos con el mismo nombre (tenga en cuenta que el nombre incluye el espacio de nombres) pero en diferentes DLL y está interesado en usar ambos, entonces usted puedes hacer esto

respuesta Corto

si su tipo de Acme.Foo en 2 DLL diferentes y desea utilizarlos. Dar la referencia un alias en la ventana de propiedades de referencia (Ver | Ventana Propiedades) y luego usarlo como esto:

extern alias TheAliasYouGaveTheReference 

TheAliasYouGaveTheReference::Acme.Foo f = new 
    TheAliasYouGaveTheReference::Acme.Foo(); 

El nombre por defecto es global for any C# program pero la nota anterior estamos usando el alias creamos en lugar de global.

El mejor enfoque es NOT en una situación como esta en primer lugar, si ambos conjuntos son suyos, entonces no cree 2 tipos con el mismo nombre exacto en el mismo espacio de nombres. Pero a veces no controlamos el código fuente, por lo que para esas ocasiones, se puede usar la solución anterior.

Respuesta larga

estoy copiando la mayor parte del artículo de here manera que se grabe aquí en caso de que el artículo ya no está disponible.

¿Cómo se llega a una situación como esta?

En primer lugar, aquí es cómo se puede replicar el escenario por lo que es muy claro lo que estamos hablando:

  1. Crear una biblioteca de clases de C# llamado FooVersion1
  2. Vuelva a colocar el código de la plantilla en la Clase 1. cs con lo siguiente:

    using System; 
    
    namespace Acme 
    { 
        public class Foo 
        { 
         public void Bar() 
         { 
          Console.WriteLine("Bar"); 
         } 
        } 
    } 
    
  3. Haga clic derecho en la solución en el Explorador de soluciones y seleccione Agregar | Nuevo proyecto

  4. guardar el proyecto actual (sólo aplicable en expreso)
  5. Seleccione una biblioteca de clases en el nuevo proyecto de diálogo y cambiar el nombre del proyecto a FooVersion2 y pulse OK
  6. Reemplace el código de Class1.cs la siguiente:

    using System; 
    
    namespace Acme 
    { 
        public class Foo 
        { 
         public void Bar() 
         { 
          Console.WriteLine("Bar"); 
         } 
    
         public void Goo() 
         { 
          Console.WriteLine("Goo"); 
         } 
        } 
    } 
    

Uso del tipo en la solicitud de

Ok, ahora tenemos 2 conjuntos diferentes que contienen Acme.Foo. Ahora crearemos una aplicación de consola e intentaremos usar cada una.

  1. Haga clic derecho en la solución en el explorador de soluciones y seleccione Agregar | Nuevo proyecto
  2. Seleccione una aplicación de consola y lo llaman al Consumidor
  3. Haga clic derecho en los consumidores y seleccionar 'Establecer como proyecto de inicio'
  4. Haga clic derecho en el nodo referencias en el proyecto del Consumidor y seleccione 'Agregar referencia'
  5. Haga clic en la pestaña de proyectos y de selección múltiple y FooVersion1 FooVersion2 Haga clic en OK
  6. Añadir la siguiente línea principal en el tipo de programa del proyecto del Consumidor:

    Acme.Foo f = new Acme.Foo(); 
    

Construir la solución a través de Ctrl + Shift + B (o F6) Note que consigue dos errores de generación [como se muestra a continuación]:

enter image description here

La solución

Aquí es cómo podemos solucionarlo:

  1. Abra el explorador de soluciones y seleccione FooVersion1 i n la carpeta Referencias del proyecto Consumer
  2. Pulse F4 (o seleccione Ver | Ventana Propiedades)
  3. Cambiar los alias de propiedad a FooVersion1
  4. Construir la solución
  5. Ahora todo va a construir correctamente, porque Acme.Foo se refiere inequívocamente a FooVersion2
  6. Añadir la siguiente directiva en la parte superior de Program.cs en el proyecto del Consumidor:

    extern alias FooVersion1; 
    
  7. Cambiar el uso de Acme.Foo a:

    FooVersion1::Acme.Foo f = new FooVersion1::Acme.Foo(); 
    f.Bar(); 
    
  8. Tenga en cuenta que cuando escribe 'f.' La lista de finalización contiene solo esos métodos en FooVersion1 de Acme.Foo (notablemente no incluye Goo)

  9. B uild la solución y todo va a construir correctamente
  10. Por último agregue el código siguiente bajo f.Bar() en Program.cs del proyecto del Consumidor:

    Acme.Foo f2 = new Acme.Foo(); 
    f2.Goo(); 
    
  11. en cuenta que una lista de terminación de f2 contiene Goo.

  12. construir de nuevo usando Ctrl + Shift + B y darse cuenta de que todavía no hay errores de generación
Cuestiones relacionadas