Каким будет способ получить папку Windows SDK в задаче MSBuild?
Используя задачу generateBootstrapper, я создаю загрузчик для своей установки, чтобы иметь возможность установить предварительные условия. Этой задаче необходим путь к папке, в которой находятся необходимые пакеты, то есть к папке Windows SDK.
"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>





Путь к загрузчику хранится в разделе реестра:
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);
}
}
Я понятия не имею, откуда берется GenericBootstrapper, поскольку его невозможно найти в реестре, даже если я установил SDK 6.0, 6.1, 8.0 и 8.1 на том же компьютере с Windows 2012 Server.
спасибо Джон. Согласно вашему сообщению, я отредактировал скрипт MSBuild для чтения папки из реестра. Однако не было необходимости добавлять «Пакеты» в конце, это была еще одна ошибка в моем исходном сценарии.
Вот рабочий сценарий:
<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>
Странно, я не вижу этот раздел реестра или связанный с ним путь после установки Windows SDK. Я что-то упускаю или все устанавливают Visual Studio на свои машины сборки?
Вы также можете использовать задачу 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 = "." />
Путь установки Windows SDK хранится в значении CurrentInstallFolder следующего раздела реестра:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows

Я понятия не имею, откуда берется GenericBootstrapper, поскольку его невозможно найти в реестре, даже если я установил SDK 6.0, 6.1, 8.0 и 8.1 на том же компьютере с Windows 2012 Server. - с
Я последовал ответу Джереми Д., но это дало сообщение об ошибке: ошибка MSB3147: не удалось найти необходимый файл «setup.bin» в «C: \ Program Files (x86) \ Microsoft SDKs \ 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)
связанные: stackoverflow.com/q/1535871/11635 (в частности, получение пути из свойств, передаваемых
Microsoft.Common.targetsв мой ответ