Навіщо використовувати сильні названі збірки?


107

Які переваги використання сильних названих збірок?

Які речі неможливо зробити за допомогою звичайної збірки?

Відповіді:


92

Дозвольте мені перерахувати переваги сильного називання вашої збірки спочатку:

  1. Сильне іменування вашої збірки дозволяє включити свою збірку в кеш глобальної асамблеї (GAC). Таким чином, це дозволяє поділитися ним між кількома програмами.

  2. Сильне називання гарантує унікальну назву для цієї збірки. Таким чином, ніхто більше не може використовувати одне і те ж ім’я збірки.

  3. Сильна назва захищає лінійку версії збірки. Надійна назва може гарантувати, що ніхто не зможе виготовити наступну версію вашої збірки. Користувачі програм гарантують, що версія збірки, яку вони завантажують, надходить від того самого видавця, який створив версію, з якою була побудована програма.

Більш детально про чітке іменування від Microsoft йдеться у Strong-Named Assembly ( MSDN ).


1
Ви впевнені в пункті 4? Я думаю, може, ця поведінка змінилася останнім часом. Я намагався змусити завантаження сильно названої збірки змінити її, але вона завантажилася без випадків.
Єнс

19
Що стосується №4, це неправильно. Він не призначений для захисту від підробки. Див. Blogs.msdn.com/b/shawnfa/archive/2005/12/13/… для отримання додаткової інформації.
Колін Боуерн

1
@ RobV8R 90% наших залежностей є відкритим джерелом, приватні ключі знаходяться у відкритих репортажах (відповідно до рекомендацій Microsoft) та доступні для всіх, хто хоче їх.
бродяга

1
@ RobV8R Тут ви не можете вживати компрометованого слова, це означає, що воно має бути в першу чергу секретом. Вказівки Microsoft полягають у тому, що приватний ключ повинен зберігатися у вашому сховищі загальнодоступних джерел. Приватні ключі не порушені, вони навмисно публікуються. Зважаючи на те, що приватні ключі відомі і призначені для використання людьми, що змінюють код відкритого джерела батьківських проектів (інакше ліцензія в багатьох випадках буде порушена), люди, які роблять це, використовували б інший номер версії, але той самий ключ, у цьому у випадку, якщо буде потрібно обов'язковий переадресація.
волоцюга

1
@ RobV8R Що я спочатку отримував, це те, що багато людей вважають, що сильне називання гарантує, що ваша залежність заблокована у певній версії збірки, і це просто не так, просте перенаправлення прив’язки може змінити версію, яку ви використовуєте за умови її використання був підписаний тим самим приватним ключем. І, як я вже сказав, приватні ключі навмисно публікуються для більшості наших залежностей.
бродяга

9

Які речі неможливо зробити за допомогою звичайної збірки?

Оскільки всі дискусії, що розпочалися з підйому Nuget, пропонували повністю позбутися від сильних іменних збірок, моя компанія намагалася це і натрапила на значну зміну поведінки, що стосується налаштувань додатків:

Якщо ви використовуєте автоматичну програму або налаштування програми, що надаються користувачем VisualStudio (успадковуючи System.Configuration.ApplicationSettingsBase), то сильний з назвою EXE створить рівно 1 каталог всередині% LOCALAPPDATA% з ім'ям, наприклад, "YourApplication.exe_StrongName_kjsdfzsuzdfiuzgpoisdipozdiufzsuifеsіsfіdіsfеdіsfеdіsсfеdеszіуdіsfеdіsсfеdіsсfеdіsсfеdіsсfеdіsсfеdеszіуdіsfіdіsеsіsіуdіsfеdіsеsіsіdіsеsіsіdіsіsіdіsіsіdіsіsіdіsіsіdіsіdеsіsеdеs) розташований.

Але без чіткої назви розташування (= шлях) EXE буде використано для створення хеш-значення, яке вже відрізняється між DEBUG і збіркою RELEASE, створюючи багато каталогів всередині% LOCALAPPDATA%, названих як "YourApplication.exe_Url_dfg8778d6fs7g6d7f8g69sdf". Це робить його непридатним для розгортань ClickOnce, де каталог установки змінюється з кожним оновленням.


5

Я хотів би додати, що без сильного імені ви не можете використовувати перенаправлення прив’язки у конфігураційних файлах.

Це не вийде:

  <dependentAssembly>
    <assemblyIdentity name="MyAssembly.MyComponent" publicKeyToken="null" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
  </dependentAssembly>

Потрібно мати маркер відкритого ключа

  <dependentAssembly>
    <assemblyIdentity name="MyAssembly.MyComponent" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
  </dependentAssembly>

9
Прив’язка переадресації не потрібна, якщо ви не маєте сильного імені.
бродяга

0

Лише приклад: я хотів би дати відповідь, роблячи більше уваги в галузі безпеки . У випадку, якщо ми створюємо збірки з вихідним кодом, які ми не хочемо використовувати повторно для третьої сторони, але хочемо, щоб він був перевіреним, ми можемо сильно підписати збірку і зробити внутрішні видимі лише для цих збірок із той же підпис.

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