문제

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>
도움이 되었습니까?

해결책

당신은 또한 사용할 수 있습니다 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="." /> 

다른 팁

감사합니다 John. 귀하의 게시물에 따르면 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의 설치 경로는 CurrentInstallFolder 다음 레지스트리 키의 값 :

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows CurrentInstallFolder

Jeremy D의 답변을 따랐지만 오류 메시지가 표시되었습니다. 오류 MSB3147 : 필요한 파일 'setup.bin'in 'c : program files (x86) microsoft sdks windows v8.0a engine'을 찾을 수 없습니다. .

그 이유는 부트 스트랩퍼로가는 경로 (적어도 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>

bootstrapper 접미사를 $ (windowssdkpath)

부트 스트랩퍼로가는 경로는 레지스트리 키 아래에 저장됩니다.

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);
   }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top