Visual Basic, warum kann ich "System.Drawing" nicht importieren, wenn meine einzige Referenz "System" ist?

7

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.

    
mdinger 19.01.2012, 17:53
quelle

4 Antworten

14

Die .NET Common Language Infrastructure hat zwei unterschiedliche Konzepte:

  • Namespaces: Präfixe für Typnamen wie System.Drawing , die zur Unterscheidung mehrerer Typen verwendet werden, die ansonsten denselben Namen hätten.
  • Assemblies: Code-Bibliotheken, die getrennt von anderen bereitgestellt, installiert und versioniert werden können Baugruppen. Die Typen in einer Assembly können sich in einer beliebigen Anzahl von Namespaces befinden.

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.

MSDN enthält eine veraltete, aber dennoch gute Beschreibung von Assemblys, Namespaces und den Unterschieden zwischen ihnen, die Sie möglicherweise hilfreich finden.

    
Michael Ratanapintha 19.01.2012, 18:04
quelle
6

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.

    
Paolo Falabella 19.01.2012 18:03
quelle
1

System.Drawing befindet sich in einer separaten Assembly, auf die Sie verweisen müssen.

    
Joey 19.01.2012 18:02
quelle
0

Auch nach dem Hinzufügen von System.Drawing als Referenz kann es immer noch nicht in einem Projekt enthalten sein.

    
Clem 20.02.2014 16:00
quelle