Сборки с сильной Подписью
-
05-09-2019 - |
Вопрос
У меня есть проект, который я сделал в Visual Basic 2008 Express.Я преобразовал его из чужого проекта C #, но он работает.Он имеет несколько зависимостей от DLL.Я решил опубликовать свой проект, чтобы установить его на другой компьютер, и для каждой библиотеки DLL я получаю сообщение об ошибке:"Сборка должна быть строго подписана, чтобы ее можно было пометить как обязательное условие". Я провел некоторое исследование, но не нашел многого, и то, что я нашел, я действительно не понимаю.Что означает эта ошибка?Каков наилучший способ решить эту проблему?Еще одна вещь:мне потребовалось МНОГО времени, чтобы правильно настроить ссылки на все мои DLL-файлы, поэтому я предпочитаю, чтобы решение НЕ имело НИЧЕГО общего с перемещением DLL-файлов, потому что это, скорее всего, нарушит функциональность моего основного проекта.
Решение
Если вы публикуете через ClickOnce, перейдите на страницу публикации и нажмите "Файлы приложения".Оттуда вы должны увидеть список ваших DLL-файлов.Убедитесь, что те из них, которые доставляют вам проблемы, имеют статус публикации, отмеченный как "Включить", а не "Обязательное условие".
Это сообщение об ошибке означает, что текущие настройки публикации предполагают, что все рассматриваемые сборки будут присутствовать в глобальном кэше сборок на целевом компьютере до того, как можно будет выполнить установку.Поскольку все сборки в GAC должны быть строго подписаны, любая сборка, помеченная как обязательное условие, которая не имеет строгой подписи, выдаст вам эту ошибку.
Другие советы
Обходной путь более прост, чем это:
- Перейдите к своему проекту.
- Щелкните правой кнопкой мыши и выберите Свойства.
- Перейдите на вкладку Безопасность.
- Снимите флажок Включить настройки безопасности ClickOnce.
Если вы не развертываете это приложение через ClickOnce, вам не нужно указывать сильные имена своих сборок.
Сборки со строгими именами - это в основном сборки, подписанные криптографическим ключом.Это довольно легко сделать с помощью Visual Studio и не требует изменения порядка ваших зависимостей.
Я использую неэкспрессную Visual Studio, поэтому шаги могут немного отличаться для вас.
- Щелкните правой кнопкой мыши на проекте и выберите свойства
- Перейдите на вкладку Подписание
- Установите флажок "Подписать сборку".
- В поле со списком выберите "<New...>"
- Завершите работу мастера
- Перестроить
Проверьте эту ссылку out...it содержит инструкции по подписанию вашей сборки строгим именем:
Чтобы создать строгое имя, просто перейдите в командную строку SDK или Visual Studio 200X, затем введите следующее
sn -k sgKey.snk
Ссылаться эта ссылка для получения подробной информации
Затем свяжите строгое имя с вашей сборкой, выполнив приведенную ниже команду
al /out:MyAssembly.dll MyOldAssembly.dll /keyfile:sgKey.snk
Это просто сработало для меня после того, как вышеупомянутые решения потерпели неудачу:
Удалите ссылку на сборку по ошибке, затем добавьте ее снова.
Я обнаружил, что моя проблема заключается в файле .csproj
<Reference Include="OtherProjectNothingToDo">
<HintPath>..\..\..\..\Pedidos\XBAP\Pedidos\Pedidos\bin\Release\Pedidos.exe</HintPath>
</Reference>
Затем я удалил его с помощью блокнота, и теперь все в порядке.
Используя Адама Робинсона решение позволило мне опубликовать, но я обнаружил, что пользователи не могут установить проект после его публикации, поскольку система конечного пользователя жаловалась на невозможность установки, указывая на место на жестком диске.Поскольку это казалось крайне маловероятным, чтобы быть первопричиной, я изучил это подробнее.
По-видимому, причиной моей проблемы было то, что одна из моих ссылок также ссылалась на .dll, которую использовал мой проект, но другой версии.У ClickOnce этого не было, и он отказался копировать вторую версию .dll в систему пользователя, сославшись на уже существующую версию.Исправляем это так, чтобы .библиотека dll и проект ссылались на ту же версию другого .библиотека dll удалила ошибку и исправила проблему с установкой.
Убедитесь, что целевой фреймворк действительно установлен на 3.5 или любой другой фреймворк, на который вы хотите настроить таргетинг.Иногда он выдает ошибку, если он не настроен должным образом.
У меня просто тоже была эта проблема.В моем случае в моем решении была ссылка на blabla.dll, но blabla.dll также использовалась в другом.dll, на которую я ссылался в своем проекте.
При проверке версий обоих blabla.dll они не были одинаковыми.Поэтому я обновил другой.dll с правильным blabla.dll, а затем сослался на новый another.dll в моем решении.Ошибка исчезла.
Короче говоря:я использовал 2 версии blabla.dll
Я надеюсь, что это имеет смысл, если нет, дайте мне знать.:)
Проверьте мой блог для более подробного объяснения:Статья в блоге
С уважением, Джейкоб Иедема