У меня есть проект, который я сделал в Visual Basic 2008 Express. Я преобразовал его из другого проекта С#, но он работает. Он имеет несколько зависимостей DLL. Я пошел, чтобы опубликовать свой проект, чтобы я мог установить его на другой компьютер, и для каждой DLL я получаю сообщение об ошибке: "Сборка должна быть сильной подписью, чтобы быть помеченной как обязательное условие". Я провел какое-то исследование, но не нашел много, и то, что я нашел, я действительно не понимаю. Что означает эта ошибка? Каков наилучший способ его решения? Еще одна вещь: мне потребовалось много времени, чтобы иметь возможность правильно обрабатывать все мои DLL, поэтому я предпочитаю, чтобы решение НИЧЕГО не делалось с перемещением DLL, потому что это, вероятно, нарушит функциональность моего основного проекта.
Сильные подписанные сборки
Ответ 1
Если вы публикуете через ClickOnce, перейдите на страницу публикации и нажмите "Файлы приложений". Оттуда вы должны увидеть список своих DLL. Убедитесь, что те, которые вас беспокоят, имеют статус публикации, обозначенный как "Включить", а не "Предварительное условие".
Это сообщение об ошибке означает, что текущие параметры публикации ожидают, что все собранные сборки будут присутствовать в глобальном кэше сборок на целевой машине до того, как будет выполнена установка. Поскольку все сборки в GAC должны быть сильными, любая сборка, помеченная как обязательное условие, которое не является сильной подписью, даст вам эту ошибку.
Ответ 2
Обходной путь более прост, чем это:
- Перейдите в свой проект.
- Щелкните правой кнопкой мыши и выберите "Свойства".
- Перейдите на вкладку "Безопасность".
- Снимите флажок Включить параметры безопасности ClickOnce.
Если вы не развертываете это приложение с помощью ClickOnce, вам не нужно создавать StrongName для своих сборок.
Ответ 3
Сильно названные сборки - это в основном сборки, которые подписаны криптографическим ключом. Это довольно легко сделать с Visual Studio и не требует переупорядочения ваших зависимостей.
Я использую не-экспресс Visual Studio, поэтому для вас могут быть несколько разные шаги.
- Щелкните правой кнопкой мыши по проекту и выберите свойства
- Нажмите вкладку Подписывание
- Установите флажок "Подписать сборку"
- В поле со списком выберите "< New... > "
- Завершите работу мастера
- Перестроить
Ответ 4
Проверьте эту ссылку... у нее есть инструкции для подписания сборки с сильным именем:
Ответ 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
Надеюсь, это имеет смысл, если не сообщит мне.:)
Проверьте мой блог для более подробного объяснения: Статья в блоге
С уважением, Джейкоб Иедема