Vra

Wat sou die pad na die gids Windows SDK haal in 'n MSBuild taak wees?

Die gebruik van die generateBootstrapper taak Ek skep van 'n boot trapper vir my setup om in staat wees om die voorvereistes installeer. Hierdie taak moet die pad na die gids waar die voorvereiste pakkette geleë is, dit wil sê die gids Windows SDK

"C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\"

wanneer die gebruik van Visual Studio 2008. So ver ek is met behulp van 'n harde-gekodeerde pad, maar dit sal nie werk nie op enige stelsel. Is daar 'n beter manier om die pad te kry?

Dit is my bou script:

<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>
Was dit nuttig?

Oplossing

Jy kan ook die GetFrameworkSdkPath MSBuild taak gebruik.

<GetFrameworkSdkPath>
  <Output TaskParameter="Path" PropertyName="WindowsSdkPath" />
</GetFrameworkSdkPath>  

Byvoorbeeld:

<GenerateBootstrapper 
  ApplicationFile="$(SolutionName).application"
  ApplicationName="$(ClickOnceAppTitle)"
  ApplicationUrl="$(ClickOnceUrl)"
  BootstrapperItems="@(BootstrapperFile)"
  Culture="en"
  FallbackCulture="en-US"
  Path="$(WindowsSDKPath)"
  OutputPath="." /> 

Ander wenke

Dankie John. Volgens jou post geredigeer ek die MSBuild script na die gids van die register te lees. Dit was egter nie nodig om "pakkette" op die einde voeg, wat nog 'n fout in my oorspronklike draaiboek was.

Die volgende is die werk script:

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

Die installering pad van die Windows SDK gestoor in die CurrentInstallFolder waarde van die volgende register sleutel:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SDK \ Windows CurrentInstallFolder

Ek het die antwoord van Jeremy D, maar dit het die fout boodskap:     fout MSB3147: Kan vereis lêer 'setup.bin' in nie vind 'C: \ Program Files (x86) \ Microsoft SDK \ Windows \ v8.0A \ Engine.

Die rede hiervoor is dat die pad na die boot trapper (ten minste met V8.0A van die SDK) is 'n subgids onder die pad teruggekeer deur die GetFrameworkSdKPath.

So die MSBuild kode wat werk vir my is:

<Target Name="AfterBuild">
  <GetFrameworkSdkPath>
    <Output TaskParameter="Path" PropertyName="WindowsSdkPath"/>
  </GetFrameworkSdkPath>
  <GenerateBootstrapper 
      ApplicationFile="myapp.msi" 
      ApplicationName="MyApplication" 
      BootstrapperItems="@(BootstrapperFile)" 
      OutputPath="$(OutputPath)" 
      Path="$(WindowsSdkPath)\Bootstrapper" />
</Target>

Let op die \ boot trapper agtervoegsel tot $ (WindowsSdkPath)

Die pad na die boot trapper gestoor onder die register sleutel:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\GenericBootstrapper\3.5

Om uit te vind die gids pakkette, maak dit, lees die "pad" register waarde, en voeg "pakkette" op die einde en wat moet jy die volle pad na die gids wat jy wil gee.

Byvoorbeeld:

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);
   }
}
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top