web-dev-qa-db-ja.com

MSBuildでWindowsSDKフォルダーを取得するにはどうすればよいですか?

MSBuildタスクでWindowsSDKフォルダーを取得する方法は何ですか?

GenerateBootstrapperタスクを使用して、前提条件をインストールできるようにセットアップ用のブートストラップを作成しています。このタスクには、前提条件のパッケージが配置されているフォルダー、つまりWindowsSDKフォルダーへのパスが必要です。

"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>
26
Dirk Vollmar

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="." /> 
22
Jeremy D

ジョンに感謝します。あなたの投稿によると、レジストリからフォルダを読み取るようにMSBuildスクリプトを編集しました。ただし、最後に「パッケージ」を追加する必要はありませんでした。これは、元のスクリプトのもう1つの間違いでした。

動作するスクリプトは次のとおりです。

<Project xmlns="http://schemas.Microsoft.com/developer/msbuild/2003">

    <PropertyGroup>
        <WindowsSDKPath>$(registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\GenericBootstrapper\[email protected])</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>
8
Dirk Vollmar

Windows SDKのインストールパスは、次のレジストリキーのCurrentInstallFolder値に保存されます。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows CurrentInstallFolder

6
marcind

Jeremy Dからの回答に従いましたが、エラーメッセージが表示されました:エラーMSB3147:「C:\ ProgramFiles(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サフィックスに注意してください

5
Kal

ブートストラップへのパスは、レジストリキーの下に保存されます。

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);
   }
}
4
John Sibly