Wenn 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 verwenden global
.
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:
- Erstellen Sie eine C # -Klassenbibliothek mit dem Namen FooVersion1
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
- Speichern Sie das aktuelle Projekt (gilt nur für Express)
- Wählen Sie im neuen Projektdialog eine Klassenbibliothek aus, ändern Sie den Projektnamen in FooVersion2 und drücken Sie OK
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.
- Klicken Sie im Solution Explorer mit der rechten Maustaste auf die Lösung und wählen Sie Hinzufügen | Neues Projekt
- Wählen Sie eine Konsolenanwendung aus und nennen Sie sie Consumer
- Klicken Sie mit der rechten Maustaste auf Consumer und wählen Sie "Als Startprojekt festlegen".
- Klicken Sie im Consumer-Projekt mit der rechten Maustaste auf den Referenzknoten und wählen Sie "Referenz hinzufügen".
- Klicken Sie auf die Registerkarte Projekte und wählen Sie FooVersion1 und FooVersion2 aus. Klicken Sie auf OK
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:
- Öffnen Sie den Solution Explorer und wählen Sie FooVersion1 im Ordner References des Consumer-Projekts aus
- Drücken Sie F4 (oder wählen Sie Ansicht | Eigenschaftenfenster).
- Ändern Sie die Aliases-Eigenschaft in FooVersion1
- Erstellen Sie die Lösung
- Jetzt wird alles korrekt erstellt, da Acme.Foo eindeutig auf FooVersion2 verweist
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).
- Erstellen Sie die Lösung und alles wird korrekt erstellt
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.
- Erstellen Sie erneut mit Strg + Umschalt + B und beachten Sie, dass immer noch keine Erstellungsfehler vorliegen