在签署EXE时,"文件具有与清单中指定的计算哈希值不同"错误

Ale*_*lex 6 c# msbuild clickonce msbuild-task

我的ClickOnce安装失败并显示错误:

File,WindowsFormsProject.exe具有与manifest中指定的不同的计算哈希值.

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

<MSBuild Targets="Publish"
         Projects="WindowsFormsProject.csproj"
         ContinueOnError="false" />
Run Code Online (Sandbox Code Playgroud)

WindowsFormsProject.csproj具有签署可执行文件的Post-Build步骤,如下所示:

signtool sign /a $(ProjectDir)\obj\$(PlatformName)\$(ConfigurationName)\$(TargetFileName)
Run Code Online (Sandbox Code Playgroud)

麻烦的是,当我查看构建日志时,我发现清单是在Post-Build事件执行之前生成的.因此哈希码不匹配就不足为奇了.构建日志中的相关行:

_CopyManifestFiles:

WindowsFormsProject - > ...\WindowsFormsProject.application

...

PostBuildEvent:

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

所以,问题是:

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

或者,如果你能想到问题的不同解决方案,我会很感激你的想法.

Dmi*_*lov 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>
Run Code Online (Sandbox Code Playgroud)