MSBuild에서 Windows SDK 폴더를 얻는 방법은 무엇입니까?
-
22-07-2019 - |
문제
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
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);
}
}