Ich bin sehr verwirrt zwischen Namespaces und Assemblies. Sind System.Data
und System.Web
Namespaces oder Assemblies?
Mir ist aufgefallen, dass diese Namespaces genannt werden und gleichzeitig im GAC_32
Ordner vorhanden sind. Was genau sind sie?
Ich bin sehr verwirrt zwischen Namespaces und Assemblies. Sind System.Data
und System.Web
Namespaces oder Assemblies?
Mir ist aufgefallen, dass diese Namespaces genannt werden und gleichzeitig im GAC_32
Ordner vorhanden sind. Was genau sind sie?
Antworten:
System.Data
ist ein Namespace , System.Data.DLL
(die Datei) ist eine Assembly .
Ein Namespace ist eine logische Gruppierung von Typen (hauptsächlich, um Namenskollisionen zu vermeiden). Eine Assembly kann Typen in mehreren Namespaces enthalten ( System.DLL
enthält einige ...), und ein einzelner Namespace kann auf Assemblys verteilt sein (z System.Threading
. B. ).
namespace
(oder eine entsprechende Anweisung in einer anderen .NET-Sprache) im Quellcode verwenden, der zum Erstellen Ihrer Assembly kompiliert wird. Beachten Sie, dass eine zweite Assembly einen Namespace erneut öffnen und weitere Klassen hinzufügen kann.
Der Namespace ist eine logische Gruppierung von Klassen, die zur gleichen Funktionalität gehört. AlsoSystem.Web
undSystem.Data
sind Namespaces
MSDN beschreibt es als:
Namespaces werden in der C # -Programmierung auf zwei Arten häufig verwendet. Erstens verwendet .NET Framework Namespaces, um die vielen Klassen zu organisieren. Zweitens kann das Deklarieren eigener Namespaces dazu beitragen, den Umfang von Klassen- und Methodennamen in größeren Programmierprojekten zu steuern.
Assembly ist ein Teil des (vorkompilierten) Codes, der von der .NET-Laufzeitumgebung ausgeführt werden kann. Es enthält einen oder mehrere Namespaces. Ein .NET-Programm besteht aus einer oder mehreren Assemblys.
System.Web.dll
und System.Data.dll
sind Baugruppen.
MSDN beschreibt es als:
Assemblys sind die Bausteine von .NET Framework-Anwendungen. Sie bilden die grundlegende Einheit für Bereitstellung, Versionskontrolle, Wiederverwendung, Aktivierungsbereich und Sicherheitsberechtigungen. Eine Assembly ist eine Sammlung von Typen und Ressourcen, die so aufgebaut sind, dass sie zusammenarbeiten und eine logische Funktionseinheit bilden. Eine Assembly stellt der Common Language Runtime die Informationen zur Verfügung, die sie für Typimplementierungen benötigt. Zur Laufzeit existiert ein Typ nicht außerhalb des Kontexts einer Assembly.
Zusamenfassend:
Versammlung:
Eine Assembly bietet eine grundlegende Einheit für die Gruppierung von physischem Code. Sie ist eine Ausgabeeinheit. Es ist eine Bereitstellungseinheit und eine Versionierungseinheit. Baugruppen enthalten MSIL-Code.
Namespace:
Ein Namespace bietet eine grundlegende Einheit für die Gruppierung von logischem Code. Es handelt sich um eine Sammlung von Namen, bei denen jeder Name eindeutig ist. Sie bilden die logische Grenze für eine Gruppe von Klassen. Der Namespace muss in den Projekteigenschaften angegeben werden.
Sie sind Namespaces. Assemblys enthalten mehr als einen Namespace. Beispiel: System.dll
Enthält diese Namespaces (und mehr):
Ein Namespace kann auch verschachtelte Namespaces enthalten. Dies sind nur logische Namen zum Organisieren des Codes. Beachten Sie jedoch, dass DLL
Dateien Assemblys sind, die Namespaces enthalten.
GAC
ist der globale Assemblycache . Laut MSDN:
Der globale Assemblycache speichert Assemblys, die speziell für die gemeinsame Nutzung durch mehrere Anwendungen auf dem Computer vorgesehen sind.
So häufig verwendete Assemblys, die im gespeichert sind, GAC
und daher müssen Sie nicht alle Assembly-Dateien in Ihr Projektverzeichnis kopieren, auf die Sie aus Ihrem Projekt verweisen. Die darin gespeicherten Assemblys GAC
sind Assemblys mit starkem Namen. Normalerweise, wenn Sie einen Verweis auf eine hinzufügen Eine Assembly aus Ihrem Projekt, die keine Strong-Named
Kopie Ihrer .dll
Datei ist, wird in Ihrem bin\Debug
Ordner erstellt. Wenn Sie möchten, können Sie Ihre Assembly (z. B. ein Klassenbibliotheksprojekt) mit einem starken Namen erstellen. Siehe: Gewusst wie: Signieren einer Assembly mit einem Strong Name
Zusamenfassend:
Tipps.
Eine Assembly enthält eine Sammlung von Typen (z. B. l'assembly System enthält viele Namespaces, einschließlich System, System.IO, ecc). Normalerweise entspricht der Name der Assembly dem eines Namespace, den er enthält, jedoch nicht immer.
Anderes Beispiel für Assemblys und Namespaces.
Assembly 1 ( CoreAssembly.DLL )
Enthält Namespaces Namespace1.subnamespace1
Assembly 2 ( ExtensionCoreAssembly.DLL )
Enthält Namespaces Namespace1.subnamespace1
Es ist möglich, den Namen der Assembly zu verwenden, die unterschiedliche Namespaces enthält, und eine vorhandene Assembly mit dieser Technik um eine andere Assembly zu erweitern.
DEFINITIONEN.
Baugruppen
Eine Assembly ist eine Sammlung von Typen und Ressourcen, die eine logische Funktionseinheit bilden. Alle Typen in .NET Framework müssen in Assemblys vorhanden sein. Die Common Language Runtime unterstützt keine Typen außerhalb von Assemblys. Jedes Mal, wenn Sie eine Microsoft Windows®-Anwendung, einen Windows-Dienst, eine Klassenbibliothek oder eine andere Anwendung mit Visual Basic .NET erstellen, erstellen Sie eine einzelne Assembly. Jede Assembly wird als EXE- oder DLL-Datei gespeichert. Hinweis Obwohl es technisch möglich ist, Assemblys zu erstellen, die mehrere Dateien umfassen, wird diese Technologie in den meisten Situationen wahrscheinlich nicht verwendet.
Namespaces
Eine andere Möglichkeit, Ihren Visual Basic .NET-Code zu organisieren, ist die Verwendung von Namespaces. Namespaces sind kein Ersatz für Assemblys, sondern eine zweite Organisationsmethode, die Assemblys ergänzt. Namespaces sind eine Möglichkeit, Typnamen zu gruppieren und die Wahrscheinlichkeit von Namenskollisionen zu verringern. Ein Namespace kann sowohl andere Namespaces als auch Typen enthalten. Der vollständige Name eines Typs enthält die Kombination von Namespaces, die diesen Typ enthalten.
Andere haben diese Frage sehr gut und ausführlich beantwortet. Aber ich möchte darauf hinweisen, dass Sie sich MSDN ansehen können, wenn Sie sich nicht sicher sind. Die MSDN-Bibliothek erklärt sehr klar und einfach den Namespace und die Assembly, in denen sich ein bestimmter Typ befindet. Es wird sogar der Name der Datei angegeben, (in System.Data.dll)
sodass keine Mehrdeutigkeit besteht.
Die Datei, die Sie in GAC sehen System.Data.dll
, ist eine Assembly und enthält Namespaces einschließlich System.Data
. Wenn Sie die Referenzeigenschaften in Visual Studio anzeigen, wird Folgendes angezeigt:
Wenn Sie später mit der rechten Maustaste auf die Referenz klicken und Ansicht im Objektbrowser auswählen, werden Namespaces in dieser bestimmten Assembly angezeigt.
Wie @amdluigi sagt: "Normalerweise ist der Name der Assembly derselbe wie ein Namespace, den sie enthält, aber nicht immer."
Oben befindet sich ein Screenshot von System.Data.dll im Objektbrowser in Studio. Es ist ein hervorragendes Beispiel, um die Probleme hier zu untersuchen. Beachten Sie, dass die meisten in der Assembly enthaltenen Namespaces System.Data oder ein Sub-Namespace von System.Data sind.
Im Allgemeinen empfiehlt es sich, Assembly-Namen mit den darin enthaltenen Namespaces in Beziehung zu setzen. Beachten Sie, dass beim Erstellen eines Projekts durch Studio zum Erstellen einer Assembly eine der Projekteigenschaften ein Standard-Namespace ist. Zu Beginn gibt Studio dem Standard-Namespace den gleichen Namen wie das Projekt selbst. Wenn Sie jemals ein Projekt umbenennen möchten, sollten Sie auch den Standard-Namespace ändern.
Es gibt zwei zusätzliche Namespaces: Microsoft.SqlServer ist verständlich. Einige SQL Server-Typen, die sie nicht in einer separaten Assembly packen wollten.
Aber was ist mit System.Xml ???? Es gibt eine System.Xml.dll-Assembly. Warum wird dieser Namespace auch in System.Data.dll angezeigt?
Beachten Sie, dass eine Assembly einen Namespace erneut öffnen und weitere hinzufügen kann - genau das macht System.Data.dll mit dem System.Xml-Namespace.
Der Grund dafür ist, dass Namespaces keine Auswirkungen auf die Leistung haben, Assemblys jedoch sehr. Wenn Sie 1000 Klassen mit erheblichen Codemengen haben, möchten Sie keine Assembly mit einem sehr großen Speicherbedarf. Sie möchten auch nicht 1000 Baugruppen mit jeweils einer Klasse. Jede Assembly muss in den Speicher geladen werden, bevor ihr Inhalt ausgeführt werden kann. Sie möchten, dass eine Assembly eine angemessene Anzahl miteinander verbundener Klassen enthält. Sobald Ihre Anwendung eine Assembly geladen hat, um eine ihrer Klassen zu erhalten, erhält sie andere Klassen, die die Anwendung wahrscheinlich kostenlos benötigt. Granularität ist wichtig: nicht zu groß, nicht zu klein, genau richtig.
Beachten Sie, dass System.Data.dll System.Xml erneut öffnet und genau eine Klasse hinzufügt: XmlDataDocument. Es kommt vor, dass diese Klasse verwendet wird, um relationale Daten als XML-Dokument zu interpretieren. Wenn Ihre Anwendung nur XML verwendet, wird diese Klasse nicht benötigt. Wenn Ihre Anwendung relationale Daten verarbeitet, ist dies möglicherweise der Fall. Während XmlDataDocument von XmlDocument erbt und sich im System.Xml-Namespace befindet, ist es in der System.Data.dll-Assembly gepackt.
All dies ist besonders wichtig, wenn Sie einen Hintergrund mit Java haben, wo es nur ein Konzept gibt, das Paket. In .NET gibt es zwei, die Assembly und den Namespace. Die beiden sind orthogonal. Eine Assembly kann offensichtlich mehr als einen Namespace enthalten. Eine Assembly kann einen Namespace erneut öffnen und weitere hinzufügen. Mit anderen Worten, die Typen in einem Namespace können mehr als eine Assembly umfassen.