Подписать исполняемый файл в приложении clickonce при публикации

У меня есть проект С# .net в Visual Studio 2013. Я успешно подписал манифест, который сказал Visual Studio также подписать сборку.

Однако исполняемый файл приложения не подписывается. После поиска в Google я добавил следующее к событию после сборки

"C:\Program Files\Microsoft SDKs\Windows\v7.1A\Bin\signtool.exe" sign /f "$(ProjectDir)certificate.pfx" /p mypassword "$(ProjectDir)obj\Debug\myapp.exe"

а также пробовал

"C:\Program Files\Microsoft SDKs\Windows\v7.1A\Bin\signtool.exe" sign /f "$(ProjectDir)certificate.pfx" /p mypassword "$(ProjectDir)bin\Debug\myapp.exe"

Кажется, это подписывает exe, однако теперь мое приложение не запускается и выдает ошибку:

Файл ECG Cloud Holter Assistant.exe имеет вычисленный хэш, отличный от указанного в манифесте.

Поэтому я думаю, что мне нужно подписать исполняемый файл прежде чем он сгенерирует манифест, но как мне это сделать?

Если я не включу команду post build, приложение будет работать нормально, но с предупреждением неизвестного издателя.


person Robin Fuller    schedule 19.02.2016    source источник
comment
Случайно ли это проект WPF?   -  person Ageonix    schedule 19.02.2016
comment
Подписание манифеста должно быть последним шагом в процессе сборки. В вашем случае вы изменяете exe-файл после подписания манифеста.   -  person nicolay.anykienko    schedule 19.02.2016
comment
Ageonix - это winform-приложение.   -  person Robin Fuller    schedule 19.02.2016
comment
Николай, да, это то, что я заметил. Интересно, как подписать исполняемый файл после его сборки, но до созданного им манифеста.   -  person Robin Fuller    schedule 19.02.2016


Ответы (1)


Попробуйте сделать следующее:
1. Щелкните правой кнопкой мыши проект winforms и выберите "Выгрузить проект".
2. Снова щелкните проект правой кнопкой мыши и выберите "Редактировать (имя_вашего_проекта).csproj".
3. Перейдите к нижней части файла и добавьте следующий раздел перед закрывающим тегом «Проект»:

<Target Name="AfterCompile">
   <Exec Command="C:\Program Files\Microsoft SDKs\Windows\v7.1A\Bin\signtool.exe" sign /f "$(ProjectDir)certificate.pfx" /p mypassword "$(ProjectDir)obj\Debug\myapp.exe" />
</Target>

4. Сохраните файл proj и закройте его.
5. Снова щелкните проект правой кнопкой мыши и перезагрузите его.

Теперь при сборке проекта вы не увидите ничего о подписи исполняемого файла приложения. в окне вывода. Это будет сделано только в том случае, если вы опубликуете, и не будет ведения журнала, сообщающего вам, что он подписал его. Как узнать, сработало ли это? Перейдите в папку, в которую вы опубликовали, и посмотрите в папке Application Files. Найдите исполняемый файл приложения в папке новой версии. Щелкните правой кнопкой мыши, выберите свойства. Найдите вкладку «Цифровые подписи». Если он не найден, он не подписан. Если вы его видите, перейдите на эту вкладку; он покажет список подписей и подписавшего сертификат. Вы можете дважды щелкнуть подписавшего, а затем просмотреть сертификат подписи.

У меня была похожая проблема, и я смог ее решить с помощью этого сообщения в блоге: https://robindotnet.wordpress.com/2013/02/24/windows-8-и-щелкнитеодинраз-окончательный-ответ-2/

person Ageonix    schedule 19.02.2016
comment
Спасибо, это сработало отлично. Главное, что нужно помнить, это «AfterCompile» — «BeforePublish», использованный в статье robindotnet, у меня не работал. - person Robin Fuller; 22.02.2016
comment
Command является атрибутом тега Exec. Поэтому его значение должно быть в кавычках. Но разве двойная кавычка после signtool.exe не предназначена для указания пути (поскольку он содержит пробелы)? если это правильно, это странное соглашение о синтаксисе. Я использовал одинарные кавычки для атрибута и двойные кавычки внутри, чтобы быть уверенным. - person Cee McSharpface; 25.07.2017