Se si dispone di 2 tipi con lo stesso nome identico (si noti che il nome include lo spazio dei nomi) ma in DLL diverse e si è interessati a utilizzarli entrambi, quindi si puoi farlo
Risposta breve
Si hanno tipo Acme.Foo
in 2 DLL diversi e si desidera utilizzarli. Dare il riferimento un alias nella finestra delle proprietà di riferimento (Visualizza | Finestra Proprietà), quindi utilizzare in questo modo:
extern alias TheAliasYouGaveTheReference
TheAliasYouGaveTheReference::Acme.Foo f = new
TheAliasYouGaveTheReference::Acme.Foo();
Il namespace di default è global
for any C# program ma nota soprattutto stiamo usando l'alias che abbiamo creato, invece di global
.
L'approccio migliore è NON entrare in una situazione come questa in primo luogo, se entrambi gli assembly sono i propri, quindi non creare 2 tipi con lo stesso nome nello stesso spazio dei nomi. Ma a volte non controlliamo il codice sorgente, quindi per quelle volte è possibile utilizzare la soluzione di cui sopra.
lungo risposta
sto copiando la maggior parte del articolo dal here in modo da riprenderli qui nel caso l'articolo non è più disponibile.
Come si entra in una situazione come questa?
In primo luogo, ecco come è possibile replicare lo scenario così è davvero chiaro che cosa stiamo parlando:
- Creare una libreria di classi C# chiamato FooVersion1
Sostituire il codice modello in Class1. cs con il seguente:
using System;
namespace Acme
{
public class Foo
{
public void Bar()
{
Console.WriteLine("Bar");
}
}
}
fare clic destro sulla soluzione in Esplora soluzioni e scegliere Aggiungi | Nuovo progetto
- Salvare il progetto corrente (applicabile solo in veloce)
- Selezionare una libreria di classi nella nuova finestra di dialogo progetto e modificare il nome del progetto per FooVersion2 e premere OK
Sostituire il codice in Class1.cs con la seguente:
using System;
namespace Acme
{
public class Foo
{
public void Bar()
{
Console.WriteLine("Bar");
}
public void Goo()
{
Console.WriteLine("Goo");
}
}
}
Uso del tipo in applicazione
Ok, quindi ora abbiamo 2 diversi assembly contenenti Acme.Foo
. Ora creiamo un'applicazione per console e proviamo a utilizzarli.
- Fare clic con il tasto destro del mouse sulla soluzione in solution explorer e selezionare Aggiungi | Nuovo progetto
- Selezionare un'applicazione console e chiamarlo consumatori
- destro del mouse sul consumatore e selezionare 'Imposta come progetto di avvio'
- pulsante destro del mouse sul nodo riferimenti nel progetto del consumatore e selezionare 'Aggiungi riferimento'
- Fare clic sulla scheda progetti, e la selezione multipla FooVersion1 e FooVersion2 Fare clic su OK
Aggiungere la seguente riga alla principale nel tipo di programma del progetto dei consumatori:
Acme.Foo f = new Acme.Foo();
Generare la soluzione tramite Ctrl + Maiusc + B (o F6) noti che si ottiene due errori di generazione [come illustrato di seguito]:
The Fix
Ecco come possiamo risolverlo:
- Aprire solution explorer e selezionare FooVersion1 i n la cartella Riferimenti del progetto Consumer
- Hit F4 (o selezionare Visualizza | Finestra Proprietà)
- Modificare le proprietà Alias FooVersion1
- Generare la soluzione
- Ora tutto sarà costruire in modo corretto, perché Acme.Foo si riferisce in modo inequivocabile a FooVersion2
Aggiungere la seguente direttiva in cima Program.cs nel progetto dei consumatori:
extern alias FooVersion1;
modificare l'utilizzo di Acme.Foo a:
FooVersion1::Acme.Foo f = new FooVersion1::Acme.Foo();
f.Bar();
Si noti che quando si digita 'f.' La lista di completamento contiene solo quei metodi in FooVersion1 di Acme.Foo (in particolare non include Goo)
- B uild la soluzione e tutto sarà costruire correttamente
Infine aggiungere il seguente codice sotto f.Bar() in Program.cs del progetto dei consumatori:
Acme.Foo f2 = new Acme.Foo();
f2.Goo();
Si noti che l'elenco di completamento delle f2 contiene Goo.
- ricostruire utilizzando Ctrl + Shift + B e notare che non ci sono ancora errori di generazione
La prima domanda che mi viene in mente è il motivo per cui stai creando 2 dll diverso per lo stesso spazio dei nomi? – Searock
Si potrebbe semplicemente provare a utilizzare due che hanno utilizzato lo stesso spazio dei nomi. – palswim
Non lo sto creando. Sto scrivendo un programma che dovrebbe usare 2 DLL che non posso cambiarle perché sono stabili nelle loro aziende. sfortunatamente hanno entrambi lo stesso nome di file e lo stesso spazio dei nomi. –