Namespace oder Assembly?

82

Ich bin sehr verwirrt zwischen Namespaces und Assemblies. Sind System.Dataund System.WebNamespaces oder Assemblies?

Mir ist aufgefallen, dass diese Namespaces genannt werden und gleichzeitig im GAC_32Ordner vorhanden sind. Was genau sind sie?

user3125433
quelle
1
Siehe stackoverflow.com/questions/668161/… , das möglicherweise etwas hilft.
Pswg

Antworten:

102

System.Dataist 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.DLLenthält einige ...), und ein einzelner Namespace kann auf Assemblys verteilt sein (z System.Threading. B. ).

D Stanley
quelle
2
Wie geben wir an, welcher Namespace in welcher Assembly enthalten sein soll?
Ehsan Sajjad
@EhsanSajjad Es gibt keine direkte Beziehung zwischen den beiden. Eine Assembly wird aus Codedateien (normalerweise über ein Projekt) erstellt, von denen jede Klassen enthält, die sich in einem Namespace befinden. Sie entscheiden dies also indirekt , indem Sie auswählen, welche Dateien sich in einem Projekt befinden. Wenn das nicht hilft, können Sie gerne eine neue Frage stellen.
D Stanley
es ergibt Sinn. Vielen Dank!!
Ehsan Sajjad
@EhsanSajjad, indem Sie die C # -Anweisung 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.
Concrete Gannet
59

Der Namespace ist eine logische Gruppierung von Klassen, die zur gleichen Funktionalität gehört. AlsoSystem.WebundSystem.Datasind 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.

Namespace

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.dllund System.Data.dllsind 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.

Versammlung

Zaheer Ahmed
quelle
Zwei Wege? Wo ist der zweite? :)
Jugal Thakkar
1
@ JugalThakkar hat es auch hinzugefügt. Weitere Details finden Sie hier.
Zaheer Ahmed
Etwas anders ausgedrückt: Namespaces haben zwei Zwecke. Eine besteht darin, ein hierarchisches "Inhaltsverzeichnis" für Typen anzugeben, damit Sie sie leichter finden oder entdecken können. Wenn Sie sich den Namen des Namespace merken können, gibt Ihnen IntelliSense eine kurze Liste seiner Typen. Der zweite Zweck besteht darin, Namenskonflikte zu verwalten und zu vermeiden. Wenn Sie die Namespaces "System", "Microsoft" und "Windows" vermeiden können, wissen Sie, dass keiner Ihrer Typen jemals mit denen von Microsoft kollidieren wird.
Concrete Gannet
16

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.

Anurag Jain
quelle
14

Sie sind Namespaces. Assemblys enthalten mehr als einen Namespace. Beispiel: System.dllEnthält diese Namespaces (und mehr):

Geben Sie hier die Bildbeschreibung ein

Ein Namespace kann auch verschachtelte Namespaces enthalten. Dies sind nur logische Namen zum Organisieren des Codes. Beachten Sie jedoch, dass DLLDateien Assemblys sind, die Namespaces enthalten.

GACist 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, GACund daher müssen Sie nicht alle Assembly-Dateien in Ihr Projektverzeichnis kopieren, auf die Sie aus Ihrem Projekt verweisen. Die darin gespeicherten Assemblys GACsind Assemblys mit starkem Namen. Normalerweise, wenn Sie einen Verweis auf eine hinzufügen Eine Assembly aus Ihrem Projekt, die keine Strong-NamedKopie Ihrer .dllDatei ist, wird in Ihrem bin\DebugOrdner 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

Selman Genç
quelle
Wer oder was bestimmt also mehr als eine Baugruppe? Ich erstelle ein Projekt mit einer Reihe von Namespaces. Was entscheidet darüber, wie viele Assemblys erstellt werden und welche Namespaces unter welchen Assemblys abgelegt werden?
eaglei22
14

Zusamenfassend:

  • Assembly wird als EXE- oder DLL-Datei gespeichert.
  • Der Namespace ist eine Möglichkeit, Typnamen zu gruppieren und die Wahrscheinlichkeit von Namenskollisionen zu verringern.

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.

Link: http://msdn.microsoft.com/en-us/library/ms973231.aspx

amdluigi
quelle
11

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.

Geben Sie hier die Bildbeschreibung ein

Bouvierr
quelle
9

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:

Geben Sie hier die Bildbeschreibung ein

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.

Geben Sie hier die Bildbeschreibung ein

Habib
quelle
2
Vielen Dank ... sehr schöne Erklärung ... :)
user3125433
6

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.

Beton Tölpel
quelle
3

Assembly ist eine physische Gruppierung von logischen Einheiten, Namespace und logischen Gruppierungen von Klassen.

Der Namespace kann mehrere Assemblys umfassen

Madhura
quelle