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

Каким будет способ получить папку 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>

связанные: stackoverflow.com/q/1535871/11635 (в частности, получение пути из свойств, передаваемых Microsoft.Common.targets в мой ответ

Ruben Bartelink 10.05.2013 12:18
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
27
1
23 866
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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);
   }
}

Я понятия не имею, откуда берется GenericBootstrapper, поскольку его невозможно найти в реестре, даже если я установил SDK 6.0, 6.1, 8.0 и 8.1 на том же компьютере с Windows 2012 Server.

sorin 19.06.2015 16:48

спасибо Джон. Согласно вашему сообщению, я отредактировал скрипт 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 на свои машины сборки?

jpierson 25.01.2011 18:48
Ответ принят как подходящий

Вы также можете использовать задачу 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

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows CurrentInstallFolder

Я понятия не имею, откуда берется GenericBootstrapper, поскольку его невозможно найти в реестре, даже если я установил SDK 6.0, 6.1, 8.0 и 8.1 на том же компьютере с Windows 2012 Server. - с

sorin 19.06.2015 16:52

Я последовал ответу Джереми Д., но это дало сообщение об ошибке: ошибка 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)

Другие вопросы по теме