27

在 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>
4

5 回答 5

23

您还可以使用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="." /> 
于 2009-05-11T18:38:10.073 回答
8

谢谢约翰。根据您的帖子,我编辑了 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>
于 2009-01-14T11:52:03.253 回答
6

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

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows CurrentInstallFolder

于 2011-05-26T06:10:39.970 回答
5

我按照 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 后缀

于 2013-03-01T10:39:33.100 回答
4

引导程序的路径存储在注册表项下:

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);
   }
}
于 2009-01-14T11:19:27.297 回答