Есть ли простой способ подписать C ++ CLI-сборку в VS 2010? - PullRequest
21 голосов
/ 17 апреля 2010

Прямо сейчас я устанавливаю опцию Linker / Advanced / KeyFile.

Я получаю "mt.exe: общее предупреждение 810100b3: это сборка с подписью со строгим именем, и встраивание манифеста делает подпись недействительной. Вам потребуется повторно подписать этот файл, чтобы сделать его действительной сборкой. «.

При чтении из Интернета звучит так, будто мне нужно установить параметр подписи с задержкой, загрузить SDK и запустить sn.exe в качестве события после сборки. Наверняка должен быть более простой способ сделать эту обычную операцию в VS2010?

Ответы [ 6 ]

15 голосов
/ 17 апреля 2010

Здесь довольно много хромоты, просто раньше это не срабатывало. Он исправлен в VS2010, теперь mt.exe генерирует предупреждение вместо того, чтобы молча пойти не так. Это ненастоящее исправление, и нет очевидного, компоновщик не может просто встроить подпись и все равно разрешить запуск mt.exe после этого.

Решение состоит в том, чтобы повторно подписать сборку событием после сборки. Сделайте так, чтобы это выглядело так:

Command = sn -Ra "$ (TargetPath)" $ (ProjectName) .snk

Если у вас еще нет файла ключа, вам нужно создать файл .snk самостоятельно, запустите sn.exe из командной строки Visual Studio. например:

cd \whereTheProjectIsLocated
sn.exe -k MyProject.snk

Или извлеките его из контейнера или используйте указанный вами файл ключа. Задержка подписания - это просто запуск sn.exe с соответствующими параметрами командной строки.

14 голосов
/ 22 февраля 2012

Если вы не можете / не хотите редактировать Microsoft.Cpp.Win32.targets, добавьте следующее в файл проекта:

<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <!-- snip -->
    <ItemDefinitionGroup>
      <Link>
        <KeyFile>$(LinkKeyFile)</KeyFile>
      </Link>
    </ItemDefinitionGroup>
</Project>
2 голосов
/ 17 января 2012

Предложение Пола Мида находится на правильном пути, но это кажется окончательным: http://blogs.msdn.com/b/vcblog/archive/2011/03/11/10140139.aspx. Обратите внимание, что текст легко изменить, но пропустите, чтобы изменить "%" на "$".

1 голос
/ 13 февраля 2015

По моему опыту, самый простой способ:

1) Откройте командную строку Visual Studio 2010.Перейдите в каталог вашего проекта (это каталог, содержащий ваши исходные файлы).Затем введите sn -k yourKeyName.snk.

2) Откройте ваш проект в Visual Studio 2010, откройте файл AssemblyInfo.cpp и добавьте эту строку [assembly:AssemblyKeyFileAttribute("yourKeyName.snk")];.

3) Откройте Project->свойства-> Linker-> Дополнительно.А в слот "Key File" и положи yourKeyName.snk.Также в слоте «Delay Sign» выберите Yes (\DELAYSIGN).

4) Создайте свой проект как обычно.

1 голос
/ 28 октября 2011

Я столкнулся с этой проблемой с VS2010 SP1 для платформы WIN32.Просматривая файл .log сборки, я обнаружил, что параметр / KEYFILE был дан исходной ссылке для .DLL, но после того, как был создан манифест, и была сделана вторая ссылка для включения манифеста, параметр / KEYFILE отсутствует.Посмотрев немного, я обнаружил, что проблема в файле Microsoft.Cpp.Win32.targets в C: \ Program Files (x86) \ MSBuild \ Microsoft.Cpp \ v4.0 \ Platforms \ Win32.Существует опечатка для атрибута KeyFile для второй ссылки.Я исправил это, изменив строку 441:

    KeyFile                        ="%(Link.KeyFile)"

на

    KeyFile                        ="$(LinkKeyFile)"

С этим изменением второй проход компоновщика включал в себя квалификатор / KeyFile, и .DLL был должным образом построен со встроенным publickey.

0 голосов
/ 17 апреля 2014

Ответ и ссылка Фила Аткина - это способ исправить эту ошибку. Microsoft наконец-то нашла решение для Visual Studio 2010, но они так и не выпустили пакет исправлений Перейдите по этой ссылке для объяснения MS и нескольких способов исправить это.

http://blogs.msdn.com/b/vcblog/archive/2011/03/11/10140139.aspx

Это сработало для меня. Спасибо Фил. (Я бы проголосовал за тебя, но я все еще новичок.)

Редактировать для Mzedeler:
Вот наиболее актуальная информация по ссылке, которую сможет использовать большинство людей. Это пропускает историю и мульти-проектные последствия. (Перейдите по ссылке, чтобы увидеть все это.)

Первое: исправление опечатки в процессе сборки:

  1. В Windows 7: выберите Пуск-> Все программы-> Стандартные
  2. Щелкните правой кнопкой мыши значок командной строки и выберите «Запуск от имени администратора» из раскрывающегося списка.
  3. Введите: cd% ProgramFiles (x86)% \ MSBuild \ Microsoft.Cpp \ v4.0 \ Platforms \ Win32
  4. Введите: notepad Microsoft.Cpp.Win32.targets
  5. Найдите цель «LinkEmbedManifest» (поиск: имя цели = «LinkEmbedManifest»)
  6. Под вышеуказанной целью и в задании «
  7. Изменить свойство DelaySign
    • From: DelaySign = "% (Link.DelaySign)"
    • To: DelaySign = "$ (LinkDelaySign)"
    • Убедитесь, что вы изменили% на $ И удалили период между Link и Delay.)
  8. Изменить свойство KeyFile
    • From: KeyFile = "% (Link.KeyFile)"
    • To: KeyFile = "$ (LinkKeyFile)"
    • Убедитесь, что вы изменили% на $ И удалили точку между связью и ключом.)
  9. Сохраните изменения и выйдите из блокнота.
  10. Выйдите из командного окна, набрав: Выход

Переопределите свойства «Key File» и «Delay Sign», используемые для подписания вашего проекта:

  1. Войдите в MS Visual Studio 2010 и откройте свой проект.
  2. Щелкните правой кнопкой мыши свой "проект", чтобы открыть страницу свойств.
  3. Перейдите в Свойства конфигурации-> Линкер-> Дополнительно
  4. Перезаписать свойство «Файл ключей» исходным файлом ключей. (например, myfile.snk)
  5. Выход из страницы свойств.
  6. Сохраните и скомпилируйте вашу программу.

Эти шаги работали для моего проекта. Для более подробной информации, перейдите по ссылке выше, которую предоставил Фил.

Конец редактирования

...