6

我的 ClickOnce 安装失败并出现错误:

文件 WindowsFormsProject.exe 的计算哈希值与清单中指定的不同。

我使用 MSBuild 生成 ClickOnce 部署包。构建脚本中的相关行:

<MSBuild Targets="Publish"
         Projects="WindowsFormsProject.csproj"
         ContinueOnError="false" />

WindowsFormsProject.csproj 有一个对可执行文件进行签名的 Post-Build 步骤,如下所示:

signtool sign /a $(ProjectDir)\obj\$(PlatformName)\$(ConfigurationName)\$(TargetFileName)

问题是,当我查看构建日志时,我看到清单是在 Post-Build 事件执行之前生成的。所以哈希码不匹配也就不足为奇了。构建日志中的相关行:

_CopyManifest 文件:

WindowsFormsProject -> ...\WindowsFormsProject.application

...

PostBuildEvent:

成功签名:...\WindowsFormsProject.exe

所以,问题是:

  1. 有没有办法在 <MSBuild> 任务期间生成清单之前对程序集进行签名?
  2. 有没有办法在构建完成后重新生成清单(仅清单),以便哈希码再次匹配?

或者,如果您能想出一个不同的解决方案来解决这个问题,我会很感激您的想法。

4

3 回答 3

8

如果您使用的是 MSBuild 4,则可以使用AfterTargets属性在程序集刚创建后和采取任何进一步步骤之前对其进行签名。删除您的构建后步骤并将此块添加到您的项目中:

<Target Name="SignOutput" AfterTargets ="CoreCompile">
  <PropertyGroup>
    <TimestampServerUrl>http://timestamp.verisign.com/scripts/timstamp.dll</TimestampServerUrl>
  <ApplicationDescription>Foo bar</ApplicationDescription>
  <SigningCertificateCriteria>/sha1 578a9486f10ed1118f2b5f428afb842e3f374793</SigningCertificateCriteria>
  </PropertyGroup>
  <ItemGroup>
    <SignableFiles Include="$(ProjectDir)obj\$(PlatformName)\$(ConfigurationName)\$(TargetName)$(TargetExt)" />
  </ItemGroup>
  <GetFrameworkSdkPath>
          <Output
              TaskParameter="Path"
              PropertyName="SdkPath" />
  </GetFrameworkSdkPath>
    <Exec Command="&quot;$(SdkPath)bin\signtool&quot; sign $(SigningCertificateCriteria) /d &quot;$(ApplicationDescription)&quot; /t &quot;$(TimestampServerUrl)&quot; &quot;%(SignableFiles.Identity)&quot;" />
</Target>
于 2012-12-20T12:26:30.643 回答
3

归功于 Dmitriy 的回答。但是,我不得不对 Dmitry 的回答稍作改动以使其对我有用。具体来说:

  • 我为“目标”添加了一个结束标签
  • 我使用的是 Windows 8.1,并且必须更改 signtool.exe 路径
  • 我正在使用 PFX 文件并且必须指定密码
  • 我不需要添加他提供的所有信息

请修改“my_signing_file.pfx”、“mypassword”、“myexe.exe”的值并使其适合您:

<Target Name="SignOutput" AfterTargets="CoreCompile">
<Exec Command="&quot;C:\Program Files (x86)\Windows Kits\8.1\bin\x64\signtool.exe&quot; sign /f &quot;$(ProjectDir)my_signing_file.pfx&quot; /p mypassword &quot;$(ProjectDir)obj\$(ConfigurationName)\myexe.exe&quot;" />
</Target>
于 2014-09-10T17:53:33.883 回答
1

您可以从 VisualStudio 配置程序集和 ClickOnce 清单的签名过程:

  1. 右键单击您的项目 > 属性 > 签名。
  2. 选中“签署 ClickOnce 清单”并选择要使用的证书。
  3. 选中“签署程序集”并选择要使用的证书。
  4. 保存所有更改并再次发布。

当您使用 MsBuild 构建时,所有这些设置都将有效。

注意:如果需要,您可以从该屏幕生成自签名证书。

注意 2:请记住,您有两个清单“应用程序清单”和“部署清单”都必须使用相同的证书进行签名。

如果您需要在构建后的任何时间重新签署清单,您可以使用Mage.exe

于 2014-12-06T02:13:04.150 回答