Frage

Was wäre der Weg, um das Windows SDK-Ordner in einer MSBuild-Aufgabe abzurufen?

die generateBootstrapper Aufgabe ich mit einem Bootstrap-Programm bin Erstellung für mein Setup der Lage sein, die Voraussetzungen zu installieren. Diese Aufgabe muss den Pfad zu dem Ordner, in dem die Voraussetzung Pakete befinden, das heißt das Windows SDK-Ordner

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

, wenn Visual Studio 2008. Bisher habe ich eine hartcodierte Pfad verwendet haben, aber dies wird auf jedem System nicht funktionieren. Gibt es einen besseren Weg, um den Weg zu bekommen?

Das ist mein Build-Skript:

<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>
War es hilfreich?

Lösung

Sie können auch die Verwendung GetFrameworkSdkPath MSBuild-Aufgabe.

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

Zum Beispiel:

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

Andere Tipps

Dank John. Nach Ihrem Beitrag bearbeiten ich den MSBuild-Skript die Ordner aus der Registrierung zu lesen. Es war jedoch nicht notwendig, „Packages“ am Ende zu anfügen, dass ein weiterer Fehler in meiner ursprünglichen Skript war.

Im Folgenden ist der Arbeits Skript:

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

Der Installationspfad des Windows SDK wird in dem CurrentInstallFolder Wert des folgenden Registrierungsschlüssels gespeichert:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SDKs \ Windows CurrentInstallFolder

Ich folgte die Antwort von Jeremy D, aber das gab die Fehlermeldung:     Fehler MSB3147: 'C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ V8.0A \ Engine'. Kann nicht benötigte Datei 'setup.bin' in finden

Der Grund hierfür ist, dass der Pfad zu dem Bootstrap-Programm (zumindest mit V8.0A des SDK) ist ein Unterverzeichnis unter dem Pfad durch den GetFrameworkSdKPath zurückgegeben.

So ist der MSBuild-Code, der funktioniert für mich ist:

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

Beachten Sie die \ Bootstrapper Suffix $ (WindowsSdkPath)

Der Weg zum Bootstrap-Programm wird unter dem Registrierungsschlüssel gespeichert:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\GenericBootstrapper\3.5

Um die Pakete Ordner bezieht, diese öffnen, lesen Sie den „Pfad“ Registrierungswert, und fügen Sie „Packages“ auf das Ende und das sollte Ihnen den vollständigen Pfad zu dem Ordner, den Sie möchten.

Zum Beispiel:

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);
   }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top