Как получить папку 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>
Ответы
Ответ 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);
}
}