Я дуже плутаюся між просторами імен та Асамблеями. Це 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.
Простір імен:
Простір імен забезпечує фундаментальну одиницю групування логічного коду. Це колекція імен, кожна з яких є унікальною. Вони утворюють логічну межу для групи класів. Простір імен повинен бути вказаний у властивостях проекту.
Коротко:
Поради.
Збірка містить колекцію типів (наприклад, 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
Вони є просторами імен. Асамблеї містять більше одного простору імен. Наприклад, System.dll
містить такі простори імен (і більше):
Також один простір імен може містити вкладені простори імен. Це лише логічні імена для організації коду. Слід пам’ятати, що DLL
файли - це збірки, що містять простір (і) імен.
GAC
- це кеш глобальної асамблеї . За даними MSDN:
Глобальний кеш збірки зберігає збірки, спеціально призначені для спільного використання декількома програмами на комп'ютері.
Таким чином , часто використовувані збірки , що зберігаються в GAC
і , отже , вам не потрібно скопіювати всі файли збірки в каталог проекту , який ви посилаєтеся з ваших збірок project.The , що зберігаються в GAC
є Strong-Named assemblies.Normally при додаванні посилання на збірка з проекту , який не є Strong-Named
копією вашого .dll
файлу буде створена на вашому bin\Debug
folder..If ви хочете , ви можете зробити свій складальні (проект бібліотеки класів, наприклад) Strong-Named.See: Як: Підписати асамблею з сильним Ім'я
Інші дали дуже добрі та детальні відповіді на це питання. Але я хочу зазначити, що коли ви не впевнені, ви можете заглянути на 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 є два - збірка та простір імен. Ці два є ортогональними. Очевидно, що збірка може містити більше одного простору імен. Збірка може знову відкрити простір імен і додати до нього більше - іншими словами, типи в просторі імен можуть охоплювати більше однієї збірки.