Подтвердить что ты не робот

Как получить папку Windows SDK в MSBuild?

Каким образом можно получить папку Windows SDK в задаче MSBuild?

Используя задачу generateBootstrapper, я создаю загрузчик для моей установки, чтобы иметь возможность устанавливать предварительные условия. Эта задача нуждается в пути к папке, в которой расположены пакеты требуемого пакета, то есть папка Windows SDK

"C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\"

при использовании Visual Studio 2008. До сих пор я использовал жестко закодированный путь, но это не сработает в какой-либо системе. Есть ли лучший способ получить путь?

Это моя сборка script:

<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>
4b9b3361

Ответ 1

Вы также можете использовать 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="." /> 

Ответ 2

спасибо Джону. Согласно вашему сообщению, я редактировал MSBuild script, чтобы прочитать папку из реестра. Однако не было необходимости добавлять "Пакеты" в конце, это была еще одна ошибка в моем оригинале script.

Ниже приведен рабочий файл script:

<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>

Ответ 3

Путь установки SDK Windows хранится в значении CurrentInstallFolder следующего раздела реестра:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows CurrentInstallFolder

Ответ 4

Я последовал за ответом Джереми D, но это дало сообщение об ошибке:   Ошибка MSB3147: Не удалось найти требуемый файл 'setup.bin' в 'C:\Program Files (x86)\Microsoft SDK\Windows\v8.0A\Engine'.

Причина в том, что путь к загрузчику (по крайней мере с V8.0A SDK) является подкаталогом по пути, возвращаемому 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>

Обратите внимание на суффикс \Bootstrapper на $(WindowsSdkPath)

Ответ 5

Путь к загрузчику хранится в разделе реестра:

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);
   }
}