Warum kann ich in Visual Studio 10 - Visual Basic "System.Drawing" nicht importieren, wenn meine einzige Referenz "System" ist? Ich kann "System.Runtime.InteropServices" importieren.
Um mein Problem zu reproduzieren:
1. Erstellen Sie ein neues Projekt in Visual Studio 10 mit Visual Basic-Klassenbibliotheksvorlage.
2. Fügen Sie "Imports System.Drawing" und "Imports System.Runtime.InteropServices" am Anfang hinzu.
3. Entfernen Sie alle Referenzen außer "System" im Bereich Referenzen der Projekteigenschaften.
Ergebnis: Visual Studio kann "System.Drawing" nicht finden, aber es kann "System.Runtime.InteropServices" finden. "System.Drawing" ist vollständig qualifiziert, daher sollte das System es im referenzierten "System" finden können.
Gedanken: Es scheint, dass "System" und "System.Drawing" eindeutige Namespaces (oder Container?) Sind, also warum nicht Qualifikation "." Arbeit? Tut "." etwas anderes darstellen?
"System" ist auch in "mscorlib" aber ist das der Namespace der benutzt wird oder ist es ein anderer?
"Microsoft.VisualBasic" ist auch in den importierten Namespaces aufgeführt, aber es gibt keinen Verweis darauf. Wie wurde es gefunden? Wo wird die Liste "Importierte Namespaces" aufgefüllt?
Ein Link zu verwandten Informationen aus der MSDN-Bibliothek wäre definitiv hilfreich. Ich habe es eine Weile durchgesehen, kann aber nicht verstehen, warum "System.Drawing" nicht importiert wird.
Die .NET Common Language Infrastructure hat zwei unterschiedliche Konzepte:
System.Drawing
, die zur Unterscheidung mehrerer Typen verwendet werden, die ansonsten denselben Namen hätten. Namespaces bilden eine Hierarchie, die auf Punkt-zu-Punkt-Trennzeichen basiert. Sie sollen also annehmen, dass die Typen im Namespace System.Runtime.InteropServices
denen im Namespace System.Runtime
untergeordnet sind. Soweit mir bekannt ist, kümmert sich die CLI jedoch nicht um den Namen oder die Hierarchie Ihrer Namespaces, es sei denn, sie machen Ihre Typnamen eindeutig.
Außerdem kann eine Assembly Typen aus mehreren Namespaces enthalten, sogar solche in verschiedenen Hierarchien, und ein einzelner Namespace kann Typen enthalten, die in mehreren Assemblys definiert sind. Wenn Sie sich die MSDN-Dokumentation für einen Typ ansehen In den .NET-Bibliotheken erfahren Sie, um welche Assembly es sich handelt. wie Paolo Falabella bereits betont hat, MSDN Sie erfahren nicht, in welcher Assembly ein Namespace enthalten ist, da ein einzelner Namespace Typen aus mehreren Assemblies enthalten kann.
In Ihrem Szenario: mscorlib
ist eine Assembly, die einige Typen im Namespace System
und viele andere definiert, z. B. System.Runtime.InteropServices
, wie Sie angegeben haben. Die Typen, die Sie im Namespace System.Drawing
verwenden, befinden sich jedoch in der Assembly System.Drawing
.
Da Assemblys die Einheit der Codebereitstellung und -wiederverwendung sind, verweisen Visual Studio-Projekte auf Assemblys, nicht auf Namespaces. Daher müssen Sie der System.Drawing-Assembly im Visual Studio-Projekt für Ihr Programm einen Verweis hinzufügen.
Die VB.NET Imports
-Anweisung (und ihr C # -Äquivalent, das using
Direktive ) können Sie auf Typen in einem Namespace verweisen, ohne jedes Mal den Namespace-Namen eingeben zu müssen . Das heißt, mit Imports System.Drawing
können Sie Graphics
in Ihren Code schreiben anstatt System.Drawing.Graphics
. Aber das ist all die Imports-Anweisung. Insbesondere:
Imports System
erstellt nicht automatisch Projektreferenzen für jede Assembly in der Welt, die zufällig Typen im Systemnamespace definiert. Imports mscorlib
bedeutet nicht, dass Sie jeden Typ in der Assembly "mscorlib" mit seinem Kurznamen referenzieren. Es bedeutet, dass Sie Typen im "mscorlib" -Namensraum durch ihre kurzen Namen referenzieren können, was nicht nur völlig anders ist, sondern auch sehr unwahrscheinlich, was Sie wollen. Unterste Zeile: Wenn Sie auf GDI + zugreifen möchten, verwenden Sie die Typen im System.Drawing-Namespace, aber dieser Name hat nichts mit dem Namen der GDI + -Assembly zu tun. Microsoft wählte den Namen "System.Drawing" für die Assembly, die GDI + -Typen enthält, aber es hätte "gdiplus-cli", "gdi-for-dotnet" oder sogar "Frotinator" wählen können. Wie auch immer der Name der Assembly lautet, Sie müssen eine Referenz zu dieser Assembly hinzufügen. Und das tun Sie nicht in Ihrem Quellcode - Sie fügen Assemblyverweise in Ihrer Visual Studio-Projektkonfiguration hinzu.
Der System.Drawing-Namespace "lebt" in einer anderen DLL, auf die im Vorlagenprojekt für eine Klassenbibliothek nicht ursprünglich verwiesen wird.
Sie müssen einen Verweis auf System.Drawing
hinzufügen (klicken Sie mit der rechten Maustaste auf das Projekt - & gt; Verweis hinzufügen; System.Drawing ist in der GAC).
Auf der MSDN können Sie sehen, in welcher Assembly jede Klasse "lebt". In der Dokumentation zur Bitmap-Klasse können Sie beispielsweise Folgendes sehen:
Namespace: System.Drawing
Assembly: System.Drawing (in System.Drawing.dll)
Beachten Sie, dass auf der Namespace-Ebene Sie die Informationen zu "Assembly" nicht finden können, weil Sie Klassen zu demselben Namespace von verschiedenen Assemblies hinzufügen können.
Tags und Links .net visual-studio-2010 reference vb.net assemblies