Простір імен чи Асамблея?


83

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

Я помітив, що вони називаються просторами імен, і в той же час вони присутні в GAC_32папці. То які вони саме?


1
Див. Stackoverflow.com/questions/668161/…, що може трохи допомогти.
pswg

Відповіді:


102

System.Data- це простір імен , System.Data.DLL(файл) - це збірка .

Простір імен - це логічне групування типів (здебільшого, щоб уникнути зіткнень імен). Збірка може містити типи в декількох просторах імен ( System.DLLмістить кілька ...), а єдиний простір імен може бути розподілений по збірках (наприклад System.Threading).


2
як ми вказуємо, який простір імен бути в якій збірці?
Ehsan Sajjad

@EhsanSajjad Між ними немає прямого зв'язку. Збірка будується з файлів коду (зазвичай через проект), кожен з яких містить класи, що знаходяться в просторі імен. Отже, ви побічно вирішуєте, вибираючи, які файли є у проекті. Якщо це не допомагає, тоді сміливо задавайте нове запитання.
D Stanley

це має сенс. Дякую!!
Ehsan Sajjad

@EhsanSajjad, використовуючи namespaceоператор C # (або еквівалент іншою мовою .NET) у вихідному коді, який компілюється для створення збірки. Зауважте, що друга збірка може повторно відкрити простір імен і додати в нього більше класів.
Concrete Gannet

59

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

MSDN описує це як:

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

простір імен

Збірка - це частина (попередньо скомпільованого) коду, який може бути виконаний середовищем виконання .NET. Він містить один або кілька просторів імен. Програма .NET складається з однієї або декількох збірок.

System.Web.dllі System.Data.dllє збірками.

MSDN описує це як:

Асамблеї - це будівельні блоки програм .NET Framework; вони утворюють основну одиницю розгортання, контролю версій, повторного використання, обсягу активації та дозволів безпеки. Збірка - це сукупність типів та ресурсів, які створені для спільної роботи та утворюють логічну одиницю функціональних можливостей. Збірка забезпечує загальномовні середовища виконання інформацією, необхідною для того, щоб знати про реалізації типів. На час виконання тип не існує поза контекстом збірки.

складання


Два шляхи? Де другий? :)
Джугал Таккар

1
@JugalThakkar теж додав. докладніше див. тут.
Zaheer Ahmed

Якщо сказати трохи інакше: простори імен мають дві цілі. Один із них - надати ієрархічну "зміст" для типів, щоб ви могли легше знаходити або виявляти їх. Якщо ви пам’ятаєте назву простору імен, IntelliSense надає вам короткий список його типів. Друга мета - керувати і уникати зіткнень імен. Якщо ви можете уникнути просторів імен "Система", "Microsoft" та "Windows", ви знаєте, що жоден з ваших типів ніколи не зіткнеться з Microsoft.
Concrete Gannet

16

Коротко:

Збірка:

Збірка забезпечує основну одиницю фізичного групування кодів - це вихідний блок. Це одиниця розгортання та одиниця версій. Збірки містять код MSIL.

Простір імен:

Простір імен забезпечує фундаментальну одиницю групування логічного коду. Це колекція імен, кожна з яких є унікальною. Вони утворюють логічну межу для групи класів. Простір імен повинен бути вказаний у властивостях проекту.


15

Коротко:

  • Асамблея зберігається як файли .EXE або .DLL.
  • Простір імен - це спосіб групування імен типів та зменшення ймовірності зіткнень імен.

Поради.

Збірка містить колекцію типів (наприклад, l'assembly System містить багато просторів імен, що включають System, System.IO, ecc). Зазвичай ім'я збірки збігається з простором імен, яке воно містить, але не завжди.

Інший приклад збірок та просторів імен.

Збірка 1 ( CoreAssembly.DLL )

Містить простори імен Простір імен1.subnamespace1

Збірка 2 ( ExtensionCoreAssembly.DLL )

Містить простори імен Простір імен1.subnamespace1

Цією технікою можна використовувати назву збірки, яка містить різні простори імен, і розширити існуючу збірку за допомогою іншої збірки.

ВИЗНАЧЕННЯ.

Асамблеї

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

Простори імен

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

Посилання: http://msdn.microsoft.com/en-us/library/ms973231.aspx


14

Вони є просторами імен. Асамблеї містять більше одного простору імен. Наприклад, System.dllмістить такі простори імен (і більше):

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

Також один простір імен може містити вкладені простори імен. Це лише логічні імена для організації коду. Слід пам’ятати, що DLLфайли - це збірки, що містять простір (і) імен.

GAC- це кеш глобальної асамблеї . За даними MSDN:

Глобальний кеш збірки зберігає збірки, спеціально призначені для спільного використання декількома програмами на комп'ютері.

Таким чином , часто використовувані збірки , що зберігаються в GACі , отже , вам не потрібно скопіювати всі файли збірки в каталог проекту , який ви посилаєтеся з ваших збірок project.The , що зберігаються в GACє Strong-Named assemblies.Normally при додаванні посилання на збірка з проекту , який не є Strong-Namedкопією вашого .dllфайлу буде створена на вашому bin\Debugfolder..If ви хочете , ви можете зробити свій складальні (проект бібліотеки класів, наприклад) Strong-Named.See: Як: Підписати асамблею з сильним Ім'я


Отже, хто чи що визначає не одну збірку? Я створюю проект із купою просторів імен. Що вирішує, скільки збірок створено і які простори імен під якими збірками?
eaglei22

11

Інші дали дуже добрі та детальні відповіді на це питання. Але я хочу зазначити, що коли ви не впевнені, ви можете заглянути на MSDN. Бібліотека MSDN дуже чітко і просто пояснює простір імен та збірки, в яких знаходиться будь-який тип. У ньому навіть вказано назву файлу, (in System.Data.dll)тому немає жодної двозначності.

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


9

Файл, який ви бачите в GAC System.Data.dll, являє собою збірку і містить простори імен, включаючи System.Data. Якщо ви переглянете довідкові властивості у Visual studio, ви побачите:

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

Пізніше, якщо ви клацнете правою кнопкою миші на посилання та виберете подання у браузері об'єктів, ви побачите простори імен у цій конкретній збірці.

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


2
Дякую ... дуже гарне пояснення ... :)
user3125433

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

Збірка - це фізичне групування логічних одиниць, простір імен, логічне групування класів.

Простір імен може охоплювати декілька збірок

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.