名前空間とアセンブリの間で非常に混乱しています。 System.Data
およびSystem.Web
名前空間またはアセンブリ?
これらは名前空間と呼ばれていると同時に、GAC_32
フォルダー。それで、彼らは正確に何ですか?
System.Data
は名前空間、System.Data.DLL
(ファイル)はアセンブリです。
ネームスペースは、タイプの論理的なグループ化です(主に名前の衝突を避けるため)。アセンブリには、複数の名前空間(System.DLL
にはいくつかが含まれています...)、単一の名前空間をアセンブリ全体に分散できます(例:System.Threading
)。
名前空間は、同じ機能に属するクラスの論理グループです。そう System.Web
およびSystem.Data
は名前空間です
MSDNはそれを次のように説明しています:
名前空間は、2つの方法でC#プログラミングで頻繁に使用されます。まず、.NET Frameworkは名前空間を使用して多くのクラスを整理します。次に、独自の名前空間を宣言すると、大規模なプログラミングプロジェクトでクラス名とメソッド名のスコープを制御できます。
アセンブリは、.NETランタイム環境で実行できる(プリコンパイル済み)コードのチャンクです。 1つまたは複数の名前空間が含まれています。 .NETプログラムは、1つ以上のアセンブリで構成されます。
System.Web.dll
およびSystem.Data.dll
はアセンブリです。
MSDNはそれを次のように説明しています:
アセンブリは、.NET Frameworkアプリケーションの構成要素です。これらは、展開、バージョン管理、再利用、アクティベーションスコーピング、およびセキュリティ許可の基本単位を形成します。アセンブリは、連携して機能の論理ユニットを形成するように構築されたタイプとリソースのコレクションです。アセンブリは、型の実装を認識するために必要な情報を共通言語ランタイムに提供します。ランタイムに対して、型はアセンブリのコンテキスト外には存在しません。
要するに:
アセンブリ:
アセンブリは、物理コードのグループ化の基本単位を提供します。これは出力単位です。これは、デプロイメントの単位であり、バージョン管理の単位です。アセンブリにはMSILコードが含まれています。
名前空間:
名前空間は、論理コードのグループ化の基本単位を提供します。各名前が一意である名前のコレクションです。これらはクラスのグループの論理境界を形成します。名前空間はProject-Propertiesで指定する必要があります。
これらは名前空間です。アセンブリには複数の名前空間が含まれます。例:System.dll
にはこれらの名前空間(およびそれ以上)が含まれます。
また、1つの名前空間にはネストされた名前空間が含まれる場合があります。これらはコードを整理するための単なる論理名です。注意してください、DLL
ファイルは名前空間を含むアセンブリです。
GAC
はグローバルアセンブリキャッシュです。 MSDN: による
グローバルアセンブリキャッシュは、コンピューター上の複数のアプリケーションによって共有されるように特に指定されたアセンブリを格納します。
そのため、GAC
に格納されている一般的に使用されるアセンブリなので、プロジェクトから参照しているプロジェクトディレクトリにすべてのAssemblyファイルをコピーする必要はありません。GAC
に格納されているアセンブリは Strong-Named アセンブリ。通常、Strong-Named
ではないプロジェクトからアセンブリへの参照を追加すると、.dll
ファイルのコピーが作成されますbin\Debug
フォルダー..必要に応じて、アセンブリ(クラスライブラリプロジェクトなど)を厳密な名前にすることができます。参照: 方法:厳密な名前でアセンブリに署名する
要するに:
ヒント
アセンブリには、タイプのコレクションが含まれます(たとえば、l'Assembly Systemには、System、System.IO、eccなどの多くの名前空間が含まれます)。通常、Assemblyの名前は、含まれている名前空間と同じですが、常にではありません。
アセンブリと名前空間の他の例。
アセンブリ1(CoreAssembly.DLL)
名前空間を含むNamespace1.subnamespace1
アセンブリ2(ExtensionCoreAssembly.DLL)
名前空間を含むNamespace1.subnamespace1
異なる名前空間を含むアセンブリの名前を使用し、この手法によって既存のアセンブリを他のアセンブリで拡張することができます。
定義。
アセンブリ
アセンブリは、機能の論理ユニットを形成するタイプとリソースのコレクションです。 .NET Frameworkのすべての型はアセンブリに存在する必要があります。共通言語ランタイムは、アセンブリ以外の型をサポートしていません。 MicrosoftWindows®アプリケーション、Windowsサービス、クラスライブラリ、またはVisual Basic .NETで他のアプリケーションを作成するたびに、1つのアセンブリを構築しています。各アセンブリは、.exeまたは.dllファイルとして保存されます。注複数のファイルにまたがるアセンブリを作成することは技術的には可能ですが、ほとんどの状況でこのテクノロジを使用することはほとんどありません。
名前空間
Visual Basic .NETコードを整理するもう1つの方法は、名前空間を使用することです。名前空間はアセンブリの代わりではなく、アセンブリを補完する2番目の組織的な方法です。名前空間は、型名をグループ化し、名前の衝突の可能性を減らす方法です。名前空間には、他の名前空間と型の両方を含めることができます。型の完全な名前には、その型を含む名前空間の組み合わせが含まれます。
他の人は、この質問に対して非常に良い詳細な回答を与えています。ただし、不明な場合は、MSDNを参照してください。 MSDNライブラリは、特定の型が存在するnamespaceおよびAssemblyを非常に明確かつ簡単に説明しています。ファイルの名前も言う(in System.Data.dll)
したがって、あいまいさはありません。
GACに表示されるファイルはSystem.Data.dll
これはアセンブリであり、System.Data
。 Visual Studioで参照プロパティを表示すると、以下が表示されます。
後で参照を右クリックしてオブジェクトブラウザでビューを選択すると、その特定のアセンブリに名前空間が表示されます。
@amdluigiが言うように、「通常、Assemblyの名前は含まれる名前空間と同じですが、常にではありません」。
StudioのオブジェクトブラウザーにSystem.Data.dllのスクリーンショットがあります。ここで問題を調査するのに最適な例です。アセンブリに含まれるほとんどの名前空間は、System.DataまたはSystem.Dataのサブ名前空間です。
一般に、アセンブリ名をその中の名前空間に関連付けることをお勧めします。 Studioが最初にプロジェクトを作成してアセンブリをビルドするとき、プロジェクトプロパティの1つがデフォルトのネームスペースであることに注意してください。開始時に、Studioはデフォルトの名前空間にプロジェクト自体と同じ名前を付けます。プロジェクトの名前を変更することを選択した場合は、デフォルトのネームスペースも変更することを検討してください。
2つの追加の名前空間があります。Microsoft.SqlServerは理解可能です。別のアセンブリにパッケージ化したくないSQL Serverタイプ。
しかし、System.Xmlには何がありますか???? System.Xml.dllアセンブリがあります。この名前空間がSystem.Data.dllにも表示されるのはなぜですか?
アセンブリが名前空間を再度開き、さらに追加できることに注意してください。これは、System.Data.dllがSystem.Xml名前空間で実行していることです。
その理由は、名前空間のパフォーマンスへの影響はゼロですが、アセンブリは非常に重要だからです。大量のコードを含む1000クラスがある場合、非常に大きなメモリフットプリントを持つ1つのアセンブリは必要ありません。それぞれが1つのクラスを持つ1000個のアセンブリも必要ありません。アセンブリを実行する前に、アセンブリをメモリにロードする必要があります。アセンブリに適切な数の相互に関係するクラスを含める必要があるため、アプリケーションがそのクラスの1つを取得するためにアセンブリをロードすると、アプリケーションが必要とする可能性が高い他のクラスを取得します。粒度は重要です。大きすぎず、小さすぎず、ちょうどいいです。
System.Data.dllがSystem.Xmlを再度開き、XmlDataDocumentというクラスを1つだけ追加することに注意してください。このクラスは、リレーショナルデータをXMLドキュメントとして解釈するために使用されることがあります。アプリケーションがXMLのみを使用している場合、このクラスは必要ありません。アプリケーションがリレーショナルデータを扱う場合は、そうするかもしれません。 XmlDataDocumentはXmlDocumentを継承し、System.Xml名前空間にありますが、System.Data.dllアセンブリにパッケージ化されています。
これは、パッケージの概念が1つしかないJavaのバックグラウンドがある場合に特に重要です。 .NETには、アセンブリと名前空間の2つがあります。 2つは直交しています。アセンブリには、明らかに複数の名前空間を含めることができます。アセンブリは、名前空間を再度開いて追加できます。つまり、名前空間の型は複数のアセンブリにまたがることができます。
アセンブリは、論理ユニットの物理的なグループ化、名前空間、クラスを論理的にグループ化することです。
名前空間は複数のアセンブリにまたがることができます