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:
- Crear una biblioteca de clases de C# llamado FooVersion1
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");
}
}
}
Haga clic derecho en la solución en el Explorador de soluciones y seleccione Agregar | Nuevo proyecto
- guardar el proyecto actual (sólo aplicable en expreso)
- Seleccione una biblioteca de clases en el nuevo proyecto de diálogo y cambiar el nombre del proyecto a FooVersion2 y pulse OK
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.
- Haga clic derecho en la solución en el explorador de soluciones y seleccione Agregar | Nuevo proyecto
- Seleccione una aplicación de consola y lo llaman al Consumidor
- Haga clic derecho en los consumidores y seleccionar 'Establecer como proyecto de inicio'
- Haga clic derecho en el nodo referencias en el proyecto del Consumidor y seleccione 'Agregar referencia'
- Haga clic en la pestaña de proyectos y de selección múltiple y FooVersion1 FooVersion2 Haga clic en OK
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]:
La solución
Aquí es cómo podemos solucionarlo:
- Abra el explorador de soluciones y seleccione FooVersion1 i n la carpeta Referencias del proyecto Consumer
- Pulse F4 (o seleccione Ver | Ventana Propiedades)
- Cambiar los alias de propiedad a FooVersion1
- Construir la solución
- Ahora todo va a construir correctamente, porque Acme.Foo se refiere inequívocamente a FooVersion2
Añadir la siguiente directiva en la parte superior de Program.cs en el proyecto del Consumidor:
extern alias FooVersion1;
Cambiar el uso de Acme.Foo a:
FooVersion1::Acme.Foo f = new FooVersion1::Acme.Foo();
f.Bar();
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)
- B uild la solución y todo va a construir correctamente
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();
en cuenta que una lista de terminación de f2 contiene Goo.
- construir de nuevo usando Ctrl + Shift + B y darse cuenta de que todavía no hay errores de generación
La primera pregunta que viene a la mente es ¿por qué estás creando 2 dll diferente para mismo espacio de nombres? – Searock
Podría estar tratando de usar dos que pasaron a usar el mismo espacio de nombres. – palswim
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. –