Подтвердить что ты не робот

Есть ли простой способ подписать сборку С++ CLI в VS 2010?

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

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

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

4b9b3361

Ответ 1

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

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

Команда = sn -Ra "$ (TargetPath)" $(ProjectName).snk

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

cd \whereTheProjectIsLocated
sn.exe -k MyProject.snk

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

Ответ 2

Если вы не можете/не будете редактировать 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>

Ответ 3

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

Ответ 4

Я столкнулся с этой проблемой с VS2010 SP1 для платформы WIN32. Глядя на файл build.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 был правильно построен с включенным publicickey.

Ответ 5

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

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

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

3) Откройте Project- > Properties- > Linker- > Advanced. И в слот "Файл ключа" и поставьте yourKeyName.snk. Также в слоте "Знак задержки" выберите Yes (\DELAYSIGN).

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

Ответ 6

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

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

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

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

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

  • В Windows 7: выберите Пуск- > Все программы- > Аксессуары
  • Щелкните правой кнопкой мыши значок командной строки и выберите "Запуск от имени администратора" в списке.
  • Введите: cd% ProgramFiles (x86)%\MSBuild\Microsoft.Cpp\v4.0\Платформы\Win32
  • Введите: блокнот Microsoft.Cpp.Win32.targets
  • Найдите цель "LinkEmbedManifest" (поиск: Target Name= "LinkEmbedManifest" )
  • Под указанной целью и в задаче "< Link" выполните следующие шаги.
  • Изменить свойство DelaySign
    • От: DelaySign = "% (Link.DelaySign)"
    • Кому: DelaySign = "$ (LinkDelaySign)"
    • Убедитесь, что вы изменили% на $И удалили период между Link и Delay.)
  • Изменить свойство KeyFile
    • От: KeyFile = "% (Link.KeyFile)"
    • To: KeyFile = "$ (LinkKeyFile)"
    • Проверьте, что вы изменили% на $И удалили период между Link и Key.)
  • Сохраните изменения и выйдите из блокнота.
  • Выйдите из окна команд, введя: Exit

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

  • Войдите в MS Visual Studio 2010 и откройте свой проект.
  • Щелкните правой кнопкой мыши на своем "проекте", чтобы открыть страницу свойств.
  • Перейдите в "Свойства конфигурации" → "Линкер" → "Дополнительно"
  • Перезаписать свойство "Key File" с вашим исходным файлом ключа. (например, myfile.snk)
  • Выйдите из страницы свойств.
  • Сохраните и скомпилируйте свою программу.

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

Редактировать конец