2010-06-10 11 views
29

Ich bin dabei, eine Bibliothek zu migrieren, die in C++ geschrieben ist und einen C# -Wrapper hat. Der C# Wrapper (LibWrapper) hat eine Reihe von Klassen mit Namensräumen, wie:Klasse mit demselben Namen in zwei Assemblys (absichtlich)

namespace MyNamespace 
    class MyClass 
    class MyOtherClass 

Meine neue Bibliothek, LibraryCS enthält die gleichen Namensräume und Klassennamen als LibWrapper (pro Benutzeranforderung), so habe ich auch:

Nachdem die Migration abgeschlossen ist, wird gerade ein Test erstellt, der die Ergebnisse der Verwendung beider Bibliotheken vergleicht, um die Migration zu validieren. Wenn ich jedoch versuche, auf MyNamespace.MyClass zu verweisen, erhalte ich einen Compiler-Fehler (erwartet!), Der besagt, dass "MyNamespace.MyClass sowohl in LibWrapper als auch in LibraryCS definiert ist".

Gibt es einen Trick um dieses Problem, mit dem ich zwei Klassen mit exakt demselben Namen, aber aus verschiedenen Assemblys im selben Client-Code verwenden kann?

Oder gibt es eine andere Möglichkeit, dies zu testen?

Das Umbenennen des migrierten Namespace in etwas wie MyNamespace2 funktioniert natürlich, aber wir wurden gebeten, es nicht zu tun, um den Client-Code leichter zu migrieren.

+0

Wäre es in Ordnung, einen Wrapper um eine der Klassen in einem anderen Namespace zu schreiben? – Goblin

+0

Wenn ich beide im selben Testcode ausführen kann, kann es akzeptabel sein. Es wird ein Wrapper sein, der nur zu Testzwecken verwendet wird. – pgb

Antwort

54

können Sie ein extern alias verwenden Typen mit denselben vollständig qualifizierten Namen aus verschiedenen Baugruppen zu verweisen. Wählen Sie den Verweis auf LibraryCS und aktualisieren Sie Aliase auf der Eigenschaftenseite von "global" auf "LibraryCS", und fügen Sie am Anfang der Quelldatei extern alias LibraryCS; hinzu. Dann können Sie LibraryCS::MyNamespace.MyClass verwenden, um auf die Klasse in LibraryCS zu verweisen. Sie können MyNamespace.MyClass oder global::MyNamespace.MyClass verwenden, um auf die Klasse in LibWrapper zu verweisen, oder Sie können auch einen Alias ​​für diese Referenz verwenden.

+4

Ich stimme mit Quartermeister überein. Weitere Informationen finden Sie unten: http://blogs.msdn.com/b/ansonh/archive/2006/09/27/774692.aspx – Kari

0

Sie könnten die erste Assembly zur Laufzeit laden und dann mit Reflection instanziieren und die Methode ausführen. Entladen Sie dann diese Assembly, laden Sie die zweite Assembly und verwenden Sie Reflektion, um sie zu erstellen und ihre Methoden auszuführen.

Es wäre wahrscheinlich einfacher 2 separate Prozesse zu verwenden, dann die resultierende Ausgabe vergleichen ...

+1

Sie können eine Assembly nicht direkt entladen, sondern nur eine AppDomain. Dazu benötigen Sie eine separate Anwendungsdomäne mit dieser Baugruppe. –

+0

Guter Aufruf, würde die AppDomain herunterfahren müssen, um die Assembly zu entladen, ich werde die Antwort bearbeiten. –

1

Sah diese Frage und Antwort und es hat mir geholfen. Wie auch immer für diejenigen, die eine detaillierte Erklärung zu demselben benötigen, fand ich eine link, die wirklich nützlich ist.

Auszug aus dem Link.

verschiedene Versionen derselben DLL in einer Anwendung mit

Schritt 1: die VS IDE. Fügen Sie den Verweis auf beide DLLs in Ihrer Clientanwendungslösung hinzu. Wählen Sie dann im Projektmappen-Explorer unter dem Referenzknoten die erste (alte Version) Klassenbibliothek aus.Im Eigenschaftenfenster ändern Sie das Feld Aliases von global bis oldVer. ly, newVer für die N ewer Version.

Schritt 2: den Code unten als die ersten Anweisungen verwenden, wo Sie es

extern alias oldVer; 
extern alias newVer; 

jetzt zu verwenden, verweisen planen

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

Hoffnung, das hilft.

Verwandte Themen