Сильные подписанные сборки

У меня есть проект, который я сделал в Visual Basic 2008 Express. Я преобразовал его из другого проекта С#, но он работает. Он имеет несколько зависимостей DLL. Я пошел, чтобы опубликовать свой проект, чтобы я мог установить его на другой компьютер, и для каждой DLL я получаю сообщение об ошибке: "Сборка должна быть сильной подписью, чтобы быть помеченной как обязательное условие". Я провел какое-то исследование, но не нашел много, и то, что я нашел, я действительно не понимаю. Что означает эта ошибка? Каков наилучший способ его решения? Еще одна вещь: мне потребовалось много времени, чтобы иметь возможность правильно обрабатывать все мои DLL, поэтому я предпочитаю, чтобы решение НИЧЕГО не делалось с перемещением DLL, потому что это, вероятно, нарушит функциональность моего основного проекта.

Ответ 1

Если вы публикуете через ClickOnce, перейдите на страницу публикации и нажмите "Файлы приложений". Оттуда вы должны увидеть список своих DLL. Убедитесь, что те, которые вас беспокоят, имеют статус публикации, обозначенный как "Включить", а не "Предварительное условие".

Это сообщение об ошибке означает, что текущие параметры публикации ожидают, что все собранные сборки будут присутствовать в глобальном кэше сборок на целевой машине до того, как будет выполнена установка. Поскольку все сборки в GAC должны быть сильными, любая сборка, помеченная как обязательное условие, которое не является сильной подписью, даст вам эту ошибку.

Ответ 2

Обходной путь более прост, чем это:

  • Перейдите в свой проект.
  • Щелкните правой кнопкой мыши и выберите "Свойства".
  • Перейдите на вкладку "Безопасность".
  • Снимите флажок Включить параметры безопасности ClickOnce.

Если вы не развертываете это приложение с помощью ClickOnce, вам не нужно создавать StrongName для своих сборок.

Ответ 3

Сильно названные сборки - это в основном сборки, которые подписаны криптографическим ключом. Это довольно легко сделать с Visual Studio и не требует переупорядочения ваших зависимостей.

Я использую не-экспресс Visual Studio, поэтому для вас могут быть несколько разные шаги.

  • Щелкните правой кнопкой мыши по проекту и выберите свойства
  • Нажмите вкладку Подписывание
  • Установите флажок "Подписать сборку"
  • В поле со списком выберите "< New... > "
  • Завершите работу мастера
  • Перестроить

Ответ 5

Чтобы создать сильное имя, просто зайдите в командную строку SDK или командную строку Visual Studio 200X, затем введите следующий

sn -k sgKey.snk

Подробнее см. эту ссылку

Затем сопоставьте сильное имя с вашей сборкой, выполнив следующую команду

al /out:MyAssembly.dll MyOldAssembly.dll /keyfile:sgKey.snk

Подробнее см. эту ссылку

Ответ 6

Это просто сработало для меня после того, как вышеупомянутые решения не удались:

Удалите ссылку на сборку по ошибке, затем добавьте ее еще раз.

Ответ 7

Убедитесь, что Target Framework на самом деле установлена ​​в 3.5 или в какой-либо среде, для которой вы хотите настроить таргетинг. Иногда он будет ошибочным, если он не установлен правильно.

Ответ 8

Я нашел свою проблему в файле .csproj

<Reference Include="OtherProjectNothingToDo">
  <HintPath>..\..\..\..\Pedidos\XBAP\Pedidos\Pedidos\bin\Release\Pedidos.exe</HintPath>
</Reference>

Затем я удалил его с помощью блокнота, и теперь все в порядке.

Ответ 9

Используя решение Адама Робинсона разрешило мне публиковать, но я обнаружил, что пользователи не могут установить проект после его публикации, так как система конечного пользователя будет жаловаться на неспособность к установке, отмечая пространство на жестком диске. Поскольку это казалось крайне маловероятным первопричиной, я смотрел дальше.

По-видимому, основой для моей проблемы было то, что одна из моих ссылок также ссылалась на DLL, используемую моим проектом, но на другую версию. ClickOnce не имел этого и отказался копировать вторую версию .dll в пользовательскую систему, ссылаясь на уже существующую версию. Исправлено так, что .dll и проект ссылались на ту же версию другого .dll, удалили ошибку и исправили проблему установки.

Ответ 10

У меня тоже была эта проблема. В моем случае ссылка blabla.dll упоминалась в моем решении, но blabla.dll также использовался в файле other.dll, на который я ссылался в своем проекте.

При проверке версий обоих blabla.dll они были не одинаковыми. Поэтому я обновил another.dll с правильным blabla.dll, а затем ссылался на новый файл other.dll в своем решении. Ошибка исчезла.

Вкратце: я использовал 2 версии blabla.dll

Надеюсь, это имеет смысл, если не сообщит мне.:)

Проверьте мой блог для более подробного объяснения: Статья в блоге

С уважением, Джейкоб Иедема