MSBuildでWindows SDKフォルダーを取得する方法は?
-
22-07-2019 - |
質問
MSBuildタスクでWindows SDKフォルダーを取得する方法は何ですか?
generateBootstrapperタスクを使用して、前提条件をインストールできるようにセットアップ用のブートストラップを作成しています。このタスクには、前提条件のパッケージがあるフォルダー、つまりWindows SDKフォルダーへのパスが必要です
"C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\"
Visual Studio 2008を使用する場合。これまでハードコーディングされたパスを使用していましたが、これはどのシステムでも機能しません。パスを取得するより良い方法はありますか?
これは私のビルドスクリプトです:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
ToolsVersion="3.5">
<ItemGroup>
<BootstrapperFile Include="Microsoft.Net.Framework.2.0">
<ProductName>.NET Framework 2.0</ProductName>
</BootstrapperFile>
<BootstrapperFile Include="Microsoft.Windows.Installer.3.1">
<ProductName>Windows Installer 3.1</ProductName>
</BootstrapperFile>
</ItemGroup>
<Target Name="Bootstrapper">
<GenerateBootstrapper ApplicationFile="mySetup.msi"
Culture="de-DE"
ApplicationName="My Application"
OutputPath="$(OutDir)\de-DE"
BootstrapperItems="@(BootstrapperFile)"
Path="C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\" />
<GenerateBootstrapper ApplicationFile="mySetup.msi"
Culture="en-US"
ApplicationName="My Application"
OutputPath="$(OutDir)\en-US"
BootstrapperItems="@(BootstrapperFile)"
Path="C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\" />
</Target>
</Project>
解決
GetFrameworkSdkPath MSBuildタスクを使用することもできます。
><GetFrameworkSdkPath>
<Output TaskParameter="Path" PropertyName="WindowsSdkPath" />
</GetFrameworkSdkPath>
例:
<GenerateBootstrapper
ApplicationFile="$(SolutionName).application"
ApplicationName="$(ClickOnceAppTitle)"
ApplicationUrl="$(ClickOnceUrl)"
BootstrapperItems="@(BootstrapperFile)"
Culture="en"
FallbackCulture="en-US"
Path="$(WindowsSDKPath)"
OutputPath="." />
他のヒント
ジョンに感謝します。あなたの投稿によると、レジストリからフォルダを読み取るためにMSBuildスクリプトを編集しました。ただし、「パッケージ」を追加する必要はありませんでした。最後に、それは元のスクリプトの別の間違いでした。
次は作業スクリプトです。
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<WindowsSDKPath>$(registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\GenericBootstrapper\3.5@Path)</WindowsSDKPath>
</PropertyGroup>
<ItemGroup>
<BootstrapperFile Include="Microsoft.Net.Framework.2.0">
<ProductName>.NET Framework 2.0</ProductName>
</BootstrapperFile>
<BootstrapperFile Include="Microsoft.Windows.Installer.3.1">
<ProductName>Windows Installer 3.1</ProductName>
</BootstrapperFile>
</ItemGroup>
<Target Name="Bootstrapper">
<GenerateBootstrapper ApplicationFile="mySetup.msi"
Culture="de-DE"
ApplicationName="My Application"
OutputPath="$(OutDir)\de-DE"
BootstrapperItems="@(BootstrapperFile)"
Path="$(WindowsSDKPath)" />
<GenerateBootstrapper ApplicationFile="mySetup.msi"
Culture="en-US"
ApplicationName="My Application"
OutputPath="$(OutDir)\en-US"
BootstrapperItems="@(BootstrapperFile)"
Path="$(WindowsSDKPath)" />
</Target>
</Project>
Windows SDKのインストールパスは、次のレジストリキーの CurrentInstallFolder
値に保存されます。
HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SDKs \ Windows
私はJeremy Dの回答に従いましたが、エラーメッセージが表示されました。 エラーMSB3147: 'C:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v8.0A \ Engine'に必要なファイル 'setup.bin'が見つかりませんでした。
理由は、ブートストラッパーへのパス(少なくともSDKのV8.0Aでは)は、GetFrameworkSdKPathによって返されるパスの下のサブディレクトリであるためです。
だから私のために働くMSBuildコードは次のとおりです:
<Target Name="AfterBuild">
<GetFrameworkSdkPath>
<Output TaskParameter="Path" PropertyName="WindowsSdkPath"/>
</GetFrameworkSdkPath>
<GenerateBootstrapper
ApplicationFile="myapp.msi"
ApplicationName="MyApplication"
BootstrapperItems="@(BootstrapperFile)"
OutputPath="$(OutputPath)"
Path="$(WindowsSdkPath)\Bootstrapper" />
</Target>
$(WindowsSdkPath)の\ Bootstrapperサフィックスに注意してください
ブートストラッパーへのパスはレジストリキーの下に保存されます:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\GenericBootstrapper\3.5
パッケージフォルダーを見つけるには、これを開き、「パス」を読みます。レジストリ値を追加し、「パッケージ」を追加します。最後に、それはあなたが望むフォルダへのフルパスを提供する必要があります。
例:
string bootStrapperPackagesFolder = "";
RegistryKey regKey = Registry.LocalMachine.OpenSubKey
(@"SOFTWARE\Microsoft\GenericBootstrapper\3.5");
if (regKey != null)
{
bootStrapperPackagesFolder = (string)regKey.GetValue("Path");
if (bootStrapperPackagesFolder != null)
{
bootStrapperPackagesFolder += @"Packages\";
Console.WriteLine(bootStrapperPackagesFolder);
}
}