6

ClickOnce のインストールが次のエラーで失敗します。

ファイル WindowsFormsProject.exe には、マニフェストで指定されたものとは異なる計算されたハッシュがあります。

MSBuild を使用して ClickOnce 展開パッケージを生成します。ビルド スクリプトの関連する行:

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

WindowsFormsProject.csproj には、次のように、実行可能ファイルに署名するビルド後の手順があります。

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

問題は、ビルド ログを見ると、ビルド後のイベントが実行される前にマニフェストが生成されていることがわかります。したがって、ハッシュ コードが一致しないことは驚くべきことではありません。ビルドログからの関連行:

_CopyManifestFiles:

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 に答える