Я очень запутался между пространствами имен и сборками. Являются ли System.Data
и System.Web
пространства имен или сборки?
Я заметил, что они называются пространствами имен, и в то же время они присутствуют в GAC_32
папке. Так что именно они?
Я очень запутался между пространствами имен и сборками. Являются ли System.Data
и System.Web
пространства имен или сборки?
Я заметил, что они называются пространствами имен, и в то же время они присутствуют в GAC_32
папке. Так что именно они?
Ответы:
System.Data
- это пространство имен , System.Data.DLL
(файл) - это сборка .
Пространство имен - это логическая группа типов (в основном, чтобы избежать конфликтов имен). Сборка может содержать типы в нескольких пространствах имен ( System.DLL
содержит несколько ...), и одно пространство имен может быть распределено по сборкам (например System.Threading
).
namespace
оператор C # (или его эквивалент на другом языке .NET) в исходном коде, который скомпилирован для создания вашей сборки. Обратите внимание, что вторая сборка может повторно открыть пространство имен и добавить в него дополнительные классы.
Пространство имен - это логическая группа классов, принадлежащих к одной функциональности. Итак,System.Web
иSystem.Data
есть пространства имен
MSDN описывает это как:
Пространства имен активно используются в программировании на C # двумя способами. Во-первых, .NET Framework использует пространства имен для организации множества своих классов. Во-вторых, объявление ваших собственных пространств имен может помочь контролировать объем имен классов и методов в более крупных проектах программирования.
Сборка - это фрагмент (предварительно скомпилированного) кода, который может выполняться средой выполнения .NET. Он содержит одно или несколько пространств имен. Программа .NET состоит из одной или нескольких сборок.
System.Web.dll
и System.Data.dll
являются сборками.
MSDN описывает это как:
Сборки - это строительные блоки приложений .NET Framework; они образуют фундаментальную единицу развертывания, контроля версий, повторного использования, определения области действия и разрешений безопасности. Сборка - это набор типов и ресурсов, которые созданы для совместной работы и образуют логическую функциональную единицу. Сборка предоставляет общеязыковой среде выполнения необходимую информацию о реализациях типов. Для среды выполнения тип не существует вне контекста сборки.
Коротко:
Сборка:
Сборка обеспечивает фундаментальную единицу группировки физического кода - единицу вывода. Это модуль развертывания и модуль управления версиями. Сборки содержат код MSIL.
Пространство имен:
Пространство имен представляет собой фундаментальную единицу логической группировки кода. Это набор имен, каждое из которых является уникальным. Они образуют логическую границу для группы классов. Пространство имен должно быть указано в Project-Properties.
Коротко:
Подсказки.
Сборка содержит набор типов (например, 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
Они представляют собой пространства имен. Сборки содержат более одного пространства имен. Например: System.dll
содержит эти пространства имен (и другие):
Также одно пространство имен может содержать вложенные пространства имен. Это просто логические имена для организации кода. Помните, что DLL
файлы - это сборки, которые содержат пространство (я) имен.
GAC
это глобальный кэш сборок . Согласно MSDN:
В глобальном кэше сборок хранятся сборки, специально предназначенные для совместного использования несколькими приложениями на компьютере.
Таким образом , часто используемые сборки , хранящиеся в GAC
и , следовательно , вам не нужно скопировать все файлы сборки в каталог проекта , который вы ссылаетесь из ваших сборок project.The , хранящихся в GAC
являются Strong-Named assemblies.Normally при добавлении ссылки на сборка из вашего проекта, которая не Strong-Named
является копией вашего .dll
файла, будет создана в вашей bin\Debug
папке .. Если вы хотите, вы можете сделать свою сборку (например, проект библиотеки классов) со строгим именем. См. Как подписать сборку с помощью строгого имя
Другие дали очень хорошие и подробные ответы на этот вопрос. Но я хочу указать, что если вы не уверены, вы можете посмотреть MSDN. Библиотека MSDN очень четко и просто объясняет пространство имен и сборку, в которой находится любой данный тип. В нем даже указано имя файла, (in System.Data.dll)
поэтому нет двусмысленности.
Файл, который вы видите в GAC System.Data.dll
, является сборкой и содержит пространства имен, включая System.Data
. Если вы просмотрите свойства ссылки в Visual Studio, вы увидите:
Позже, если вы щелкните правой кнопкой мыши ссылку и выберите представление в обозревателе объектов, вы увидите пространства имен в этой конкретной сборке.
Как говорит @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 их два: сборка и пространство имен. Эти два ортогональны. Очевидно, что сборка может содержать более одного пространства имен. Сборка может повторно открыть пространство имен и добавить в него больше - другими словами, типы в пространстве имен могут охватывать более одной сборки.