【问题标题】:How to get the Windows SDK folder in MSBuild?如何在 MSBuild 中获取 Windows SDK 文件夹?
【发布时间】:2009-01-14 10:05:37
【问题描述】:

在 MSBuild 任务中检索 Windows SDK 文件夹的方法是什么?

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

【问题讨论】:

标签: msbuild winapi bootstrapper


【解决方案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 脚本以从注册表中读取文件夹。然而,没有必要在末尾附加“包”,这是我原始脚本中的另一个错误。

    以下是工作脚本:

    <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?
    【解决方案3】:

    Windows SDK 的安装路径存储在以下注册表项的CurrentInstallFolder 值中:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows

    【讨论】:

    • 我不知道 GenericBootstrapper 是从哪里来的,因为即使我在同一台 Windows 2012 Server 机器上安装了 SDK 6.0、6.1、8.0 和 8.1,似乎也无法在注册表中找到它。 – s
    【解决方案4】:

    我按照 Jeremy D 的回答,但给出了错误消息: 错误 MSB3147:在“C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\Engine”中找不到所需的文件“setup.bin”。

    原因是引导程序的路径(至少在 SDK 的 V8.0A 中)是 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>
    

    注意 $(WindowsSdkPath) 的 \Bootstrapper 后缀

    【讨论】:

      【解决方案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 来自哪里,因为即使我在同一台 Windows 2012 Server 机器上安装了 SDK 6.0、6.1、8.0 和 8.1,在注册表中似乎也无法找到。
      猜你喜欢
      • 1970-01-01
      • 2020-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-10
      相关资源
      最近更新 更多