2010-09-09 22 views
47

Ho due file DLL che hanno entrambi lo stesso spazio dei nomi ma hanno funzioni e tipi diversi. come posso fare riferimento a entrambe le DLL nel mio progetto e usare le loro funzioni e tipi?due diverse DLL con lo stesso spazio dei nomi

a proposito. queste due DLL hanno alcune funzioni e tipi con lo stesso nome e diversa implementazione e alcune funzioni e tipi unici

+0

La prima domanda che mi viene in mente è il motivo per cui stai creando 2 dll diverso per lo stesso spazio dei nomi? – Searock

+1

Si potrebbe semplicemente provare a utilizzare due che hanno utilizzato lo stesso spazio dei nomi. – palswim

+0

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. –

risposta

72

Non c'è niente di speciale che devi fare - basta fare riferimento a loro e usare i tipi. I namespace possono estendersi su più assiemi senza problemi, perché non sono tipi veramente opachi. Uno spazio dei nomi è solo un modo per aggiungere un prefisso comune a tutti i tipi in esso contenuti, consentendo di avere più tipi con lo stesso nome in spazi dei nomi diversi. (Il framework non li vede come aventi gli stessi nomi, perché ha un nome "completo" di tutto - che ha un alias e uno spazio dei nomi in primo piano.)

Nel raro caso che si fa riferimento a 2 assiemi che hanno lo stesso nome di tipo e gli stessi spazi dei nomi (ad esempio 2 versioni differenti della stessa dll): è possibile distinguere l'assembly da utilizzare per un dato tipo utilizzando un alias. L'alias predefinito per tutti i riferimenti è global, ma è possibile specificare il proprio alias per qualsiasi assembly quando lo si fa riferimento (utilizzando un commutatore - o semplicemente si utilizza la finestra delle proprietà in Visual Studio) - e si ha una clausola extern alias <name> nella parte superiore della propria file di codice in cui lo si utilizza - si dovrebbe accedere ai tipi da diverse assemblee con <name>::MyNamespace.Type

+13

Qui puoi leggere "alias esterno" qui: http://msdn.microsoft.com/en-us/library/ms173212.aspx – porges

4

è possibile utilizzare la funzione di alias/di riferimento (importazione di metadati) (compilatore C# Opzioni) opzione del compilatore per risolvere i vostri problemi, letti da here per ulteriori dettagli

10

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:

  1. Creare una libreria di classi C# chiamato FooVersion1
  2. Sostituire il codice modello in Class1. cs con il seguente:

    using System; 
    
    namespace Acme 
    { 
        public class Foo 
        { 
         public void Bar() 
         { 
          Console.WriteLine("Bar"); 
         } 
        } 
    } 
    
  3. fare clic destro sulla soluzione in Esplora soluzioni e scegliere Aggiungi | Nuovo progetto

  4. Salvare il progetto corrente (applicabile solo in veloce)
  5. Selezionare una libreria di classi nella nuova finestra di dialogo progetto e modificare il nome del progetto per FooVersion2 e premere OK
  6. 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.

  1. Fare clic con il tasto destro del mouse sulla soluzione in solution explorer e selezionare Aggiungi | Nuovo progetto
  2. Selezionare un'applicazione console e chiamarlo consumatori
  3. destro del mouse sul consumatore e selezionare 'Imposta come progetto di avvio'
  4. pulsante destro del mouse sul nodo riferimenti nel progetto del consumatore e selezionare 'Aggiungi riferimento'
  5. Fare clic sulla scheda progetti, e la selezione multipla FooVersion1 e FooVersion2 Fare clic su OK
  6. 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]:

enter image description here

The Fix

Ecco come possiamo risolverlo:

  1. Aprire solution explorer e selezionare FooVersion1 i n la cartella Riferimenti del progetto Consumer
  2. Hit F4 (o selezionare Visualizza | Finestra Proprietà)
  3. Modificare le proprietà Alias ​​FooVersion1
  4. Generare la soluzione
  5. Ora tutto sarà costruire in modo corretto, perché Acme.Foo si riferisce in modo inequivocabile a FooVersion2
  6. Aggiungere la seguente direttiva in cima Program.cs nel progetto dei consumatori:

    extern alias FooVersion1; 
    
  7. modificare l'utilizzo di Acme.Foo a:

    FooVersion1::Acme.Foo f = new FooVersion1::Acme.Foo(); 
    f.Bar(); 
    
  8. 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)

  9. B uild la soluzione e tutto sarà costruire correttamente
  10. Infine aggiungere il seguente codice sotto f.Bar() in Program.cs del progetto dei consumatori:

    Acme.Foo f2 = new Acme.Foo(); 
    f2.Goo(); 
    
  11. Si noti che l'elenco di completamento delle f2 contiene Goo.

  12. ricostruire utilizzando Ctrl + Shift + B e notare che non ci sono ancora errori di generazione
Problemi correlati