Como obter a pasta Windows SDK no MSBuild?
-
22-07-2019 - |
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 ??p>
"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>
Solução
Você também pode usar o href="http://msdn.microsoft.com/en-us/library/ms164298.aspx" rel="noreferrer"> GetFrameworkSdkPath tarefa
Por exemplo: <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="." />
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
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);
}
}