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

84

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

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

user3125433
источник
1
См. Stackoverflow.com/questions/668161/…, это может немного помочь.
pswg 03

Ответы:

102

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

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

Д Стэнли
источник
2
как указать, какое пространство имен будет в какой сборке?
Эхсан Саджад
@EhsanSajjad Между ними нет прямой связи. Сборка создается из файлов кода (обычно через проект), каждый из которых содержит классы, находящиеся в пространстве имен. Таким образом, вы косвенно решаете это, выбирая, какие файлы находятся в проекте. Если это не поможет, задайте новый вопрос.
D Stanley
это имеет смысл. Благодаря!!
Эхсан Саджад
@EhsanSajjad, используя namespaceоператор C # (или его эквивалент на другом языке .NET) в исходном коде, который скомпилирован для создания вашей сборки. Обратите внимание, что вторая сборка может повторно открыть пространство имен и добавить в него дополнительные классы.
Concrete Gannet
60

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

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

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

пространство имен

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

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

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

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

сборка

Захир Ахмед
источник
Два пути? Где второй? :)
Jugal Thakkar
1
@JugalThakkar тоже это добавил. подробнее см. здесь.
Захир Ахмед
Другими словами: пространства имен имеют две цели. Один из них - предоставить иерархическое «оглавление» для типов, чтобы вам было легче находить или обнаруживать их. Если вы помните имя пространства имен, IntelliSense предоставит вам краткий список его типов. Вторая цель - управлять конфликтами имен и избегать их. Если вы можете избежать пространств имен «Система», «Microsoft» и «Windows», вы знаете, что ни один из ваших типов никогда не будет конфликтовать с типами Microsoft.
Бетонная олуша,
17

Коротко:

Сборка:

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

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

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

Анураг Джайн
источник
15

Коротко:

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

Подсказки.

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

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

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

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

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

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

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

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

Сборки

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

Пространства имён

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

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

Amdluigi
источник
14

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

введите описание изображения здесь

Также одно пространство имен может содержать вложенные пространства имен. Это просто логические имена для организации кода. Помните, что DLLфайлы - это сборки, которые содержат пространство (я) имен.

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

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

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

Селман Генч
источник
Так кто или что определяет более одной сборки? Я создаю проект с кучей пространств имен. От чего зависит, сколько сборок будет создано и какие пространства имен принадлежат каким сборкам?
eaglei22 05
11

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

введите описание изображения здесь

Бувьер
источник
9

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

введите описание изображения здесь

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

введите описание изображения здесь

Хабиб
источник
6

Как говорит @amdluigi: «Обычно имя сборки совпадает с пространством имен, которое она содержит, но не всегда».

Выше приведен снимок экрана System.Data.dll в обозревателе объектов в Studio. Это отличный пример для изучения проблем здесь. Обратите внимание, что большинство пространств имен, содержащихся в сборке, являются 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 их два: сборка и пространство имен. Эти два ортогональны. Очевидно, что сборка может содержать более одного пространства имен. Сборка может повторно открыть пространство имен и добавить в него больше - другими словами, типы в пространстве имен могут охватывать более одной сборки.

Бетонная олуша
источник
3

Сборка - это физическая группировка логических единиц, Пространство имен, логически группирует классы.

Пространство имен может охватывать несколько сборок

мадхура
источник