Каковы преимущества использования сборок со строгими именами?
Что нельзя сделать с обычной сборкой?
Каковы преимущества использования сборок со строгими именами?
Что нельзя сделать с обычной сборкой?
Ответы:
Позвольте мне сначала перечислить преимущества строгого именования вашей сборки:
Строгое присвоение имени сборке позволяет вам включить ее в глобальный кэш сборок (GAC). Таким образом, вы можете делиться им между несколькими приложениями.
Строгое именование гарантирует уникальное имя для этой сборки. Таким образом, никто другой не может использовать то же имя сборки.
Строгое имя защищает происхождение версии сборки. Строгое имя может гарантировать, что никто не сможет создать следующую версию вашей сборки. Пользователи приложения могут быть уверены, что загружаемая ими версия сборки поступает от того же издателя, который создал версию, с которой было создано приложение.
Подробнее о строгом именовании от Microsoft можно найти в сборках со строгими именами ( MSDN ).
Что нельзя сделать с обычной сборкой?
Поскольку все обсуждения, которые начались с появлением Nuget, предлагали полностью избавиться от сборок со строгими именами, моя компания попробовала это и обнаружила значительное изменение поведения, когда дело доходит до настроек приложения:
Если вы используете автоматическое приложение или пользовательские настройки приложения, предоставляемые VisualStudio (наследуя System.Configuration.ApplicationSettingsBase), то EXE со строгим именем создаст ровно 1 каталог внутри% LOCALAPPDATA% с именем, например, "YourApplication.exe_StrongName_kjsdfzsuzdfiuzgpoisdiufzsdouif" независимо от того, где находится EXE расположен.
Но без строгого имени местоположение (= путь) EXE будет использоваться для создания значения хэша, которое уже различается между сборками DEBUG и RELEASE, создавая множество каталогов внутри% LOCALAPPDATA% с именами типа «YourApplication.exe_Url_dfg8778d6fs7g6d7f8g69sdf». Это делает его непригодным для развертываний ClickOnce, где каталог установки изменяется при каждом обновлении.
Я хотел бы добавить, что без строгого имени вы не можете использовать перенаправления привязки в файлах конфигурации.
Это не будет работать:
<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>
Просто пример: я хотел бы дать ответ, сделав больший акцент на безопасности . В случае, если мы создаем сборки с исходным кодом, который мы не хотим повторно использовать для третьей стороны, но хотим, чтобы он был тестируемым, мы можем строго подписать сборку и сделать внутреннюю часть видимой только для тех сборок с такая же подпись.