Pergunta

Qual seria o caminho para recuperar a pasta Windows SDK em uma tarefa MSBuild?

Usando a tarefa GenerateBootstrapper Estou criando um bootstrapper para minha configuração para ser capaz de instalar os pré-requisitos. Esta tarefa precisa o caminho para a pasta onde os pacotes pré-requisito estão localizados, ou seja, o Windows SDK pasta

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

quando usando o Visual Studio 2008. Até agora, tenho vindo a utilizar um caminho hard-coded, mas isso não vai funcionar em qualquer sistema. Existe uma maneira melhor para obter o caminho?

Este é o meu script de compilação:

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

Outras dicas

graças John. De acordo com o seu post eu editei o script MSBuild para ler a pasta do registro. Foi, no entanto, não é necessário acrescentar "Pacotes" na final, que foi outro erro no meu roteiro original.

A seguir está o script de trabalho:

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

O caminho de instalação do Windows SDK é armazenado no valor CurrentInstallFolder da seguinte chave do registro:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SDKs \ Windows CurrentInstallFolder

Eu segui a resposta de Jeremy D, mas que deu a mensagem de erro: erro MSB3147: não foi possível encontrar o necessário arquivo 'setup.bin' em 'C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v8.0A \ Engine'.

A razão é que o caminho para a inicialização (pelo menos com V8.0A do SDK) representa um subdirectório no caminho retornado pelo GetFrameworkSdKPath.

Assim, o código MSBuild que funciona para mim é:

<Target Name="AfterBuild">
  <GetFrameworkSdkPath>
    <Output TaskParameter="Path" PropertyName="WindowsSdkPath"/>
  </GetFrameworkSdkPath>
  <GenerateBootstrapper 
      ApplicationFile="myapp.msi" 
      ApplicationName="MyApplication" 
      BootstrapperItems="@(BootstrapperFile)" 
      OutputPath="$(OutputPath)" 
      Path="$(WindowsSdkPath)\Bootstrapper" />
</Target>

Observe o \ Bootstrapper sufixo $ (WindowsSdkPath)

O caminho para o bootstrapper é armazenado na chave de registro:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\GenericBootstrapper\3.5

Para a pasta de pacotes, abra isso, leia o "Caminho" valor de registo, e acrescentar "Pacotes" na extremidade e que deve dar-lhe o caminho completo para a pasta que você deseja.

Por exemplo:

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