Пространство имен или сборка?

Я очень запутался между пространствами имен и сборками. Являются ли System.Data и System.Web пространствами имен или ассемблиями?

Я заметил, что они называются пространствами имен и в то же время они присутствуют в папке GAC_32. Итак, что именно они?

Ответ 1

System.Data - пространство имен, System.Data.DLL (файл) является сборкой.

Пространство имен представляет собой логическую группировку типов (в основном, чтобы избежать столкновений имен). Сборка может содержать типы в нескольких пространствах имен (System.DLL содержит несколько...), и одно пространство имен может быть распространено по сборкам (например, System.Threading).

Ответ 2

Пространство имен - это логическая группировка классов, принадлежащих к той же функциональности. Таким образом, System.Web и System.Data являются пространствами имен

MSDN описывает это как:

Пространства имен сильно используются в программировании на С# двумя способами. Во-первых,.NET Framework использует пространства имен для организации своих многочисленных классов. Во-вторых, объявление собственных пространств имен может помочь контролировать область имен классов и методов в более крупных проектах программирования.

namespace

Assembly - это фрагмент (предварительно скомпилированный) код, который может быть запущен средой выполнения .NET. Он содержит одно или несколько пространств имен. Программа .NET состоит из одной или нескольких сборок.

System.Web.dll и System.Data.dll являются сборками.

MSDN описывает это как:

Ассембли являются строительными блоками приложений .NET Framework; они образуют основную единицу развертывания, контроль версий, повторное использование, определение области действия и разрешения безопасности. Сборка представляет собой набор типов и ресурсов, которые созданы для совместной работы и образуют логическую единицу функциональности. Сборка обеспечивает общую языковую среду выполнения с информацией, которая должна быть осведомлена о реализациях типов. Для среды выполнения тип не существует вне контекста сборки.

assembly

Ответ 3

Короче:

Сборка:

Сборка представляет собой фундаментальную единицу физической группировки кода. Это модуль вывода. Это единица развертывания и блок управления версиями. Ассембли содержат код MSIL.

Пространство имен:

Пространство имен предоставляет базовую единицу группировки логических кодов. Это коллекция имен, в которых каждое имя уникально. Они образуют логическую границу для группы классов. Пространство имен должно быть указано в свойствах проекта.

Ответ 4

Они являются пространствами имен. Сборники содержат более одного пространства имен. Например: System.dll содержит эти пространства имен (и более):

enter image description here

Также одно пространство имен может содержать вложенные пространства имен. Это просто логические имена для организации кода. Следует помнить, что файлы DLL представляют собой сборки, содержащие пространства имен.

GAC Глобальный кэш сборок. Согласно MSDN:

Кэш глобальной сборки хранит сборки, специально предназначенные для совместного использования несколькими приложениями на компьютере.

Часто используемые сборки, хранящиеся в GAC, и поэтому вам не нужно копировать все файлы сборки в каталог вашего проекта, ссылающийся на ваш проект. Сборки, хранящиеся в GAC, Strong-Named. Обычно, когда вы добавляете ссылку на сборку из вашего проекта, который не является Strong-Named, копия вашего файла .dll будет создана в вашей папке bin\Debug..Если вы хотите сделать свою сборку (например, проект библиотеки классов) Strong-Named.See: Как зарегистрировать сборку с сильным именем

Ответ 5

Файл, который вы видите в GAC, System.Data.dll, является сборкой и содержит пространства имен, включая System.Data. Если вы просмотрите свойства Reference в Visual Studio, вы увидите:

enter image description here

Позже, если вы щелкните правой кнопкой мыши по ссылке и выберите вид в обозревателе объектов, вы увидите пространства имен в этой конкретной сборке.

enter image description here

Ответ 6

Короче:

  • Сборка хранится как .EXE или .DLL файлы.
  • Пространство имен - это способ группировки имен типов и уменьшения вероятности столкновений имен.

Советы.

Сборка содержит набор типов (например, l'assembly System содержит много пространств имен, включенных System, System.IO, ecc). Как правило, имя сборки совпадает с именем пространства, которое оно содержит, но не всегда.

Другой пример сборок и пространств имен.

Сборка 1 (CoreAssembly.DLL)

Содержит пространства имен Namespace1.subnamespace1

Сборка 2 (ExtensionCoreAssembly.DLL)

Содержит пространства имен Namespace1.subnamespace1

Можно использовать имя сборки, которая содержит разные пространства имен, и расширять существующую сборку с помощью другой сборки с помощью этой техники.

ОПРЕДЕЛЕНИЯ.

Сборка

Сборка представляет собой набор типов и ресурсов, которые образуют логическую единицу функциональности. Все типы в .NET Framework должны существовать в сборках; общая среда исполнения не поддерживает типы вне сборок. Каждый раз, когда вы создаете приложение Microsoft Windows®, службу Windows, библиотеку классов или другое приложение с Visual Basic.NET, вы создаете единую сборку. Каждая сборка хранится как файл .exe или .dll. Примечание. Хотя технически возможно создавать сборки, которые охватывают несколько файлов, вы вряд ли будете использовать эту технологию в большинстве ситуаций.

Namespaces

Другой способ организовать ваш код Visual Basic.NET - это использование пространств имен. Пространства имен не заменяют сборки, а второй организационный метод, который дополняет сборки. Пространства имен - это способ группировки имен типов и уменьшения вероятности столкновений имен. Пространство имен может содержать как другие пространства имен, так и типы. Полное имя типа включает комбинацию пространств имен, которые содержат этот тип.

Ссылка: http://msdn.microsoft.com/en-us/library/ms973231.aspx

Ответ 7

Другие дали очень хорошие и подробные ответы на этот вопрос. Но я хочу отметить, что, когда вы не уверены, вы можете посмотреть на MSDN. Библиотека MSDN объясняет очень четко и просто пространство имен и сборка, в которой находится данный тип. Он даже говорит имя файла (in System.Data.dll), поэтому нет никакой двусмысленности.

enter image description here

Ответ 8

Как пишет @amdluigi: "Как правило, имя сборки совпадает с именем, которое оно содержит, но не всегда".

В обозревателе объектов в Studio есть снимок экрана из System.Data.dll. Это отличный пример для изучения проблем здесь. Обратите внимание, что большинство пространств имен, содержащихся в сборке, являются System.Data или подпространством имен System.Data.

В целом, хорошо, что имена сборки должны быть связаны с пространствами имен внутри них. Обратите внимание, что когда Studio сначала создает проект для сборки сборки, одним из свойств проекта является пространство имен по умолчанию. Вначале Studio предоставляет пространство имен по умолчанию с тем же именем, что и сам проект. Если вы когда-либо захотите переименовать проект, подумайте также об изменении своего пространства имен по умолчанию.

Есть два дополнительных пространства имен: Microsoft.SqlServer понятен. Некоторые типы SQL Server, которые они не хотели упаковывать в отдельную сборку.

Но что с System.Xml???? Существует сборка System.Xml.dll. Почему это пространство имен также отображается в System.Data.dll?

Обратите внимание, что сборка может повторно открыть пространство имен и добавить к нему больше - именно то, что делает System.Data.dll с пространством имен System.Xml.

Причина в том, что пространства имен имеют нулевые значения производительности, но сборки очень много. Если у вас 1000 классов с большим количеством кода, вы не хотите, чтобы одна сборка имела очень большой объем памяти. Также вы не хотите 1000 сборок каждый с одним классом. Любая сборка должна быть загружена в память до того, как ее содержимое будет выполнено. Вы хотите, чтобы сборка содержала разумное количество взаимосвязанных классов, поэтому, как только ваше приложение загрузило сборку для получения одного из своих классов, она получит другие классы, которые, скорее всего, потребуются для приложения. Гранулярность важна: не слишком большая, не слишком маленькая, просто.

Обратите внимание, что System.Data.dll повторно открывает System.Xml и добавляет ровно один класс: XmlDataDocument. Случается, что этот класс используется для интерпретации реляционных данных как XML-документа. Если ваше приложение просто использует XML, ему не нужен этот класс. Если ваше приложение имеет дело с реляционными данными, оно может. Таким образом, хотя XmlDataDocument наследуется от XmlDocument и находится в пространстве имен System.Xml, он упакован в сборку System.Data.dll.

Все это особенно важно, если у вас есть фон с Java, где есть только одна концепция, пакет. В .NET есть две, сборка и пространство имен. Эти два ортогональны. Очевидно, что сборка содержит более одного пространства имен. Сборка может снова открыть пространство имен и добавить к нему больше - другими словами, типы в пространстве имен могут охватывать более одной сборки.