2010-06-10 17 views
29

Sono in procinto di migrare una libreria che è scritta in C++ e ha un wrapper C#. Il C# involucro (LibWrapper) ha una serie di classi con spazi dei nomi, come:Classe con lo stesso nome in due assembly (intenzionalmente)

namespace MyNamespace 
    class MyClass 
    class MyOtherClass 

mia nuova libreria, LibraryCS contiene gli stessi spazi dei nomi e nomi di classe come LibWrapper (requisito per utente), quindi ho anche:

namespace MyNamespace 
    class MyClass 
    class MyOtherClass 

Ora che la migrazione è terminata, sono in procinto di creare un test che confronta i risultati dell'utilizzo di entrambe le librerie per convalidare la migrazione. Tuttavia, quando provo a fare riferimento a MyNamespace.MyClass, ricevo un errore del compilatore (prevedibilmente!) Che dice "MyNamespace.MyClass è definito sia in LibWrapper che in LibraryCS".

C'è qualche trucco intorno a questo problema, che mi consentirà di utilizzare due classi con lo stesso nome ma provenienti da diversi assembly nello stesso codice client?

In alternativa, c'è un altro modo per testare questo?

Rinominare lo spazio dei nomi migrato in qualcosa come MyNamespace2 funzionerà ovviamente, ma ci è stato chiesto di non farlo, al fine di mantenere più facile la migrazione del codice client.

+0

Va bene scrivere un wrapper attorno a una delle classi esistenti in un altro spazio dei nomi? – Goblin

+0

Se sono in grado di eseguire entrambi nello stesso codice di test, potrebbe essere accettabile. Sarà un wrapper utilizzato solo a scopo di test. – pgb

risposta

54

È possibile utilizzare un extern alias per fare riferimento i tipi con lo stesso nome completo da diverse assemblee. Selezionare il riferimento a LibraryCS e aggiornare gli alias nella pagina delle proprietà da "globale" a "LibraryCS" e aggiungere extern alias LibraryCS; nella parte superiore del file di origine, quindi utilizzare LibraryCS::MyNamespace.MyClass per fare riferimento alla classe in LibraryCS. È possibile utilizzare MyNamespace.MyClass o global::MyNamespace.MyClass per fare riferimento alla classe in LibWrapper oppure è possibile utilizzare anche un alias per tale riferimento.

+4

Sono d'accordo con Quartermeister. Vedi sotto per ulteriori riferimenti: http://blogs.msdn.com/b/ansonh/archive/2006/09/27/774692.aspx – Kari

0

È possibile caricare il primo assembly in fase di esecuzione, quindi utilizzare il reflection per istanziarlo ed eseguire il metodo. Quindi scaricare l'assembly, caricare il secondo assembly e utilizzare reflection per crearlo ed eseguire i suoi metodi.

È probabilmente più facile da usare 2 processi separati quindi confrontare l'output risultante ...

+1

Non è possibile scaricare direttamente un assieme, solo un AppDomain. Per fare ciò, hai bisogno di un appdomain separato con quell'assembly. –

+0

Una buona chiamata, dovrebbe rimuovere l'AppDomain per scaricare l'assembly, modificherò la risposta. –

1

Ho visto questa domanda e risposta e mi ha aiutato. Come mai per coloro che hanno bisogno di una spiegazione dettagliata sullo stesso, ho trovato uno link che è davvero utile.

Estratto dal collegamento.

Utilizzando differenti versioni dello stesso DLL in un'applicazione

passaggio 1: usando l'VS IDE. Aggiungere il riferimento a entrambe le DLL nella soluzione dell'applicazione client. Quindi in Esplora soluzioni sotto il nodo di riferimento selezionare la prima libreria di classi (versione precedente).Nella finestra delle proprietà cambia il campo Alias ​​da globale a oldVer. lly, newVer per la N versione di ewer.

Fase 2: utilizzare il codice qui sotto le prime dichiarazioni in cui si prevede di fare riferimento a esso

extern alias oldVer; 
extern alias newVer; 

ora di utilizzare,

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

Spero che questo aiuti.

Problemi correlati