Ich habe zwei DLL-Dateien, die den gleichen Namespace haben, aber unterschiedliche Methoden und Typen haben. Wie kann ich beide DLLs in meinem Projekt referenzieren und ihre Methoden und Typen verwenden?
Übrigens haben diese beiden DLLs einige Methoden und Typen mit demselben Namen, aber unterschiedlicher Implementierung und einigen eindeutigen Methoden und Typen.
c#
visual-studio-2010
.net-2.0
Codierung von Yoshi
quelle
quelle
Antworten:
Sie müssen nichts Besonderes tun - referenzieren Sie sie einfach und verwenden Sie die Typen. Namespaces können sich problemlos über mehrere Assemblys erstrecken, da es sich nicht wirklich um undurchsichtige Typen handelt. Ein Namespace ist nur eine Möglichkeit, allen darin enthaltenen Typen ein gemeinsames Präfix hinzuzufügen, sodass Sie mehrere Typen desselben Namens unter verschiedenen Namespaces haben können. (Das Framework sieht sie nicht als gleichnamig an, da es den "vollqualifizierten" Namen von allem sieht - an dessen Vorderseite ein Alias und ein Namespace angehängt sind.)
In dem seltenen Fall, dass Sie auf 2 Assemblys verweisen, die dieselben Typnamen und dieselben Namespaces haben (z. B. 2 verschiedene Versionen derselben DLL), können Sie mithilfe eines Alias unterscheiden, welche Assembly für einen bestimmten Typ verwendet werden soll. Der Standardalias für alle Verweise ist
global
, aber Sie können Ihren eigenen Alias für jede Assembly angeben, wenn Sie darauf verweisen (mithilfe eines Compiler-Schalters - oder verwenden Sie einfach das Eigenschaftenfeld in Visual Studio) - und eineextern alias <name>
Klausel oben in Ihrer Codedatei einfügen Wo Sie es verwenden - Sie würden mit verschiedenen Baugruppen auf die Typen zugreifen<name>::MyNamespace.Type
quelle
extern alias
: msdn.microsoft.com/en-us/library/ms173212.aspxWenn Sie zwei Typen mit genau demselben Namen haben (beachten Sie, dass der Name den Namespace enthält), sich jedoch in verschiedenen DLLs befinden und beide verwenden möchten, können Sie dies tun.
Kurze Antwort
Sie haben
Acme.Foo
2 verschiedene DLLs eingegeben und möchten diese verwenden. Geben Sie der Referenz im Fenster mit den Referenzeigenschaften (Ansicht | Eigenschaftenfenster) einen Alias und verwenden Sie ihn wie folgt:extern alias TheAliasYouGaveTheReference TheAliasYouGaveTheReference::Acme.Foo f = new TheAliasYouGaveTheReference::Acme.Foo();
Der Standard-Namespace gilt
global
für jedes C # -Programm. Beachten Sie jedoch, dass wir anstelle des von uns erstellten Alias den Alias verwendenglobal
.Der beste Ansatz ist, NICHT in eine solche Situation zu geraten. Wenn beide Assemblys Ihre eigenen sind, erstellen Sie keine zwei Typen mit genau demselben Namen im genau gleichen Namespace. Aber manchmal kontrollieren wir den Quellcode nicht, so dass für diese Zeiten die obige Lösung verwendet werden kann.
Lange Antwort
Ich kopiere den größten Teil des Artikels von hier, sodass er hier aufgezeichnet wird, falls der Artikel nicht mehr verfügbar ist.
Wie kommst du in eine solche Situation?
Zunächst können Sie das Szenario wie folgt replizieren, damit wirklich klar ist, wovon wir sprechen:
Ersetzen Sie den Vorlagencode in Class1.cs durch Folgendes:
using System; namespace Acme { public class Foo { public void Bar() { Console.WriteLine("Bar"); } } }
Klicken Sie im Solution Explorer mit der rechten Maustaste auf die Lösung und wählen Sie Hinzufügen | Neues Projekt
Ersetzen Sie den Code in Class1.cs durch Folgendes:
using System; namespace Acme { public class Foo { public void Bar() { Console.WriteLine("Bar"); } public void Goo() { Console.WriteLine("Goo"); } } }
Verwendung des Typs in der Anwendung
Ok, jetzt haben wir 2 verschiedene Baugruppen mit
Acme.Foo
. Lassen Sie uns nun eine Konsolenanwendung erstellen und versuchen, jede zu verwenden.Fügen Sie im Programmtyp des Consumer-Projekts die folgende Zeile zu Main hinzu:
Acme.Foo f = new Acme.Foo();
Erstellen Sie die Lösung über Strg + Umschalt + B (oder F6). Beachten Sie, dass zwei Erstellungsfehler angezeigt werden [wie unten gezeigt]:
Die Reparatur
So können wir das beheben:
Fügen Sie die folgende Anweisung oben in Program.cs im Consumer-Projekt hinzu:
extern alias FooVersion1;
Ändern Sie die Verwendung von Acme.Foo in:
FooVersion1::Acme.Foo f = new FooVersion1::Acme.Foo(); f.Bar();
Beachten Sie dies, wenn Sie 'f' eingeben. Die Abschlussliste enthält nur die Methoden in FooVersion1 von Acme.Foo (insbesondere enthält sie nicht Goo).
Fügen Sie abschließend den folgenden Code unter f.Bar () in Program.cs des Consumer-Projekts hinzu:
Acme.Foo f2 = new Acme.Foo(); f2.Goo();
Beachten Sie, dass die Abschlussliste von f2 Goo enthält.
quelle
Alias
Immobilie noch nie verstanden und frühere Suchanfragen ergaben keine Ergebnisse.können Sie die Alias - Funktion der / Referenz (Metadaten importieren) (C # Compiler - Optionen) Compiler - Option verwenden , um Ihre Probleme zu lösen, von Lesen Sie hier , um weitere Informationen
quelle