Visual Studio 2012を使用しているときにSignTool.exeへのパスを取得するにはどうすればよいですか?
Visual Studio 2010では、使用できます
_<Exec Command=""$(FrameworkSDKDir)bin\signtool.exe" sign /p ... />
_
ここで、$(FrameworkSDKDir)
は
_"c:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\"
_
しかし、Visual Studio 2012では、$(FrameworkSDKDir)
は
_ "C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\"
_
そしてSignToolは
_ "c:\Program Files (x86)\Windows Kits\8.0\bin\x64\"
_
ハードコーディング以外にこのディレクトリへのパスを取得する方法はありますか(FrameworkSDKDir
とWindowsSDKDir
を試しましたが、両方ともv8.0Aディレクトリを指します)。
私はちょうど同じ問題に遭遇しました。 Visual Studio 2012コマンドプロンプトからビルドを実行することはできましたが、IDEで失敗していました。詳細または診断ログを探すと、 MSBuildログのデフォルトの場所はどこですか? になり、Visual Studioが本当に必要な診断情報を提供できないことがわかりました。
これが私が最終的にそれを修正するためにしたことです。
通常のコマンドプロンプト(Visual Studioのコマンドプロンプトではありません)を開き、MSBuild(%SystemRoot%\ Microsoft.NET\Framework\v4.0.30319\MSBuild.exe)へのパスを完全修飾して、そこからmsbuildを実行します。最終的に、Visual Studio 2012で受け取っていたのと同じエラーメッセージ(エラーコード9009)を受け取りました。
次に、/ v:diagスイッチを追加して、「診断」ログ(すべてのプロパティとアイテムの値を表示)を使用して同じビルドを実行します。
この出力から、signtool.exeの場所を取得するために使用できるいくつかの新しいプロパティがあることがわかりました(以下の抜粋)。
windir = C:\Windows
windows_tracing_flags = 3
windows_tracing_logfile = C:\BVTBin\Tests\installpackage\csilogfile.log
WindowsSDK80Path = C:\Program Files (x86)\Windows Kits\8.0\
WIX = C:\Program Files (x86)\WiX Toolset v3.7\
したがって、この問題に対する私の解決策は、*。targetsファイルに以下を追加することでした。
<SignToolPath Condition=" Exists('$(WindowsSDK80Path)bin\x86\signtool.exe') and '$(SignToolPath)'=='' and '$(PROCESSOR_ARCHITECTURE)'=='x86' ">$(WindowsSDK80Path)bin\x86\signtool.exe</SignToolPath>
<SignToolPath Condition=" Exists('$(WindowsSDK80Path)bin\x64\signtool.exe') and '$(SignToolPath)'=='' and '$(PROCESSOR_ARCHITECTURE)'=='AMD64' ">$(WindowsSDK80Path)bin\x64\signtool.exe</SignToolPath>
これもあなたのお役に立てば幸いです。目的に合った他のプロパティが利用できるため、このポイントに到達した方法の前文を含めました。
OK.
VisualStudioセットアップにClickOnce Publishing Toolsを追加する必要がありました:
この後、signtool.exeを見つけます
Visual Studio 2017をインストールすると、
また、Visual Studio 2017 15.7.4を使用すると、選択したインストールしたWindows 10キットに従ってパスが再び変更されます。
Visual Studio 2017のDeveloperコマンドプロンプトを開始することにより、ジェネリックパスを取得します
where signtool.exe
以下は、ビルドマシンの特定の構成に基づいてSignToolPath
変数を見つけて設定するために使用できる、より一般的なアプローチです。レジストリを読み取ることにより:
<PropertyGroup>
<WindowsKitsRoot>$([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Kits\Installed Roots', 'KitsRoot81', null, RegistryView.Registry32, RegistryView.Default))</WindowsKitsRoot>
<WindowsKitsRoot Condition="'$(WindowsKitsRoot)' == ''">$([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Kits\Installed Roots', 'KitsRoot', null, RegistryView.Registry32, RegistryView.Default))</WindowsKitsRoot>
<SignToolPath Condition="'$(SignToolPath)' == ''">$(WindowsKitsRoot)bin\$(Platform)\</SignToolPath>
</PropertyGroup>
これは、$(Platform)
がarm
、x86
、またはx64
のいずれかに解決されることを前提としています。それ以外の場合は、$(Platform)
マクロを適切なディレクトリに置き換えます。
[〜#〜] edit [〜#〜](2017.07.05):
これは、新しいWindows 10 Kitに委ねられ、<PropertyGroup>
を($Platform)=='AnyCPU'
に強制する更新されたx86
です。
<PropertyGroup>
<WindowsKitsRoot>$([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Kits\Installed Roots', 'KitsRoot10', null, RegistryView.Registry32, RegistryView.Default))</WindowsKitsRoot>
<WindowsKitsRoot Condition="'$(WindowsKitsRoot)' == ''">$([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Kits\Installed Roots', 'KitsRoot81', null, RegistryView.Registry32, RegistryView.Default))</WindowsKitsRoot>
<WindowsKitsRoot Condition="'$(WindowsKitsRoot)' == ''">$([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Kits\Installed Roots', 'KitsRoot', null, RegistryView.Registry32, RegistryView.Default))</WindowsKitsRoot>
<SignToolPath Condition=" '$(SignToolPath)' == '' And '$(Platform)' == 'AnyCPU' ">$(WindowsKitsRoot)bin\x86\</SignToolPath>
<SignToolPath Condition="'$(SignToolPath)' == ''">$(WindowsKitsRoot)bin\$(Platform)\</SignToolPath>
</PropertyGroup>
Resolve-Path "C:\Program Files*\Windows Kits\*\bin\*\signtool.exe"
出力:
Path
----
C:\Program Files (x86)\Windows Kits\8.0\bin\x64\signtool.exe
C:\Program Files (x86)\Windows Kits\8.0\bin\x86\signtool.exe
C:\Program Files (x86)\Windows Kits\8.1\bin\arm\signtool.exe
C:\Program Files (x86)\Windows Kits\8.1\bin\x64\signtool.exe
C:\Program Files (x86)\Windows Kits\8.1\bin\x86\signtool.exe