Inkl .NET installer in der WiX-Bundle nicht erkennen, wenn bereits installiert

Bin ich auf WiX 3.7, und ich kann nicht den einfachen <PackageGroupRef Id="NetFx40Web"/> bundle-element zu arbeiten, da es nicht bringen über die Netto-FX-installer-Paket, oder Betten Sie es in der setup.exe. Ich habe gegriffen zu erstellen mein eigenes Paket für diese in meinen Bundle.wxs Datei, aber ich bin immer noch Probleme. Es scheint immer zu versuchen, zu installieren .NET 4, auch wenn die Maschine schon hat .NET installiert.

Ich bin mir nicht ganz sicher, ob der Unterschied zwischen InstallCondition und DetectCondition. Ich denke InstallCondition wird verwendet, um das Paket zu installieren, wenn die Auswertung true, ansonsten deinstallieren. Wie funktioniert das mit Dingen, die in der Regel permanent=ja, wie die meisten Voraussetzungen? DetectCondition ist fast das Gegenteil, ich denke, dass es überprüft, ob es bereits auf dem system, und wenn dem so ist, nicht installieren.

Unten ist mein voller Bundle.wxs Datei, die in ein Visual Studio WiX-Bootstrapper-Projekt. Ich bin versucht zu schauen, der Registrierung und den Umfang aus .NET 4.0 registry-Schlüssel vorhanden ist. Wenn es vorhanden ist, dann möchte ich nicht installieren .NET 4., und wenn es nicht da ist, dann installieren Sie es. Aber, funktioniert das nicht, und es versucht immer zu installieren .NET.

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Bundle
        Name="MyProgramBootstrapper"
        Version="1.0.0.0"
        Manufacturer="Microsoft"
        UpgradeCode="{2299B51D-9FD8-4278-90C8-2B79DB37F402}">

        <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" />
        <Chain>
          <PackageGroupRef Id="Netfx4Full"/>
          <MsiPackage
              Id="MyProgramInstaller"
              SourceFile="$(var.MyProgramInstaller.TargetPath)"
              Compressed="no"/>
        </Chain>
    </Bundle>

    <Fragment>
        <Property Id="NET40_FULL_INSTALL_32">
            <RegistrySearch
                Id ="SearchNet40_32bit"
                Root="HKLM"
                Key="SOFTWARE\Microsoft\Net Framework Setup\NDP\v4\Full"
                Name="Version"
                Type ="raw"/>
        </Property>
        <Property
            Id="NET40_FULL_INSTALL_64">

            <RegistrySearch
                Id ="SearchNet40_64bit"
                Root="HKLM"
                Key="SOFTWARE\Microsoft\Net Framework Setup\NDP\v4\Full"
                Name="Version"
                Type ="raw"
                Win64="yes" />
        </Property>

        <WixVariable
            Id="WixMbaPrereqPackageId"
            Value="Netfx4Full" />
        <WixVariable
            Id="WixMbaPrereqLicenseUrl"
            Value="NetfxLicense.rtf" />
        <PackageGroup
            Id="Netfx4Full">
          <ExePackage
              Id="Netfx4Full"
              Cache="no"
              Compressed="no"
              PerMachine="yes"
              Permanent="yes"
              Vital="yes"
              SourceFile="C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages\DotNetFX40\dotNetFx40_Full_x86_x64.exe"
              DetectCondition="NET40_FULL_INSTALL_32 OR NET40_FULL_INSTALL_64"
              DownloadUrl="http://go.microsoft.com/fwlink/?LinkId=164193"/>
        </PackageGroup>
    </Fragment>
</Wix>

Bootstrapper installer-Protokoll:

[010C:2FB0][2013-05-10T12:07:07]w120: Detected partially cached package: Netfx4Full, invalid payload: Netfx4Full, reason: 0x80070570
[010C:2FB0][2013-05-10T12:07:07]i052: Condition 'NETFRAMEWORK40' evaluates to false.
[010C:2FB0][2013-05-10T12:07:07]w120: Detected partially cached package: MyInstaller, invalid payload: f4832BA0972BDE9B6FA8A19FBB614A7BA, reason: 0x80070570
[010C:2FB0][2013-05-10T12:07:07]i101: Detected package: Netfx4Full, state: Absent, cached: Partial

Update mit der Lösung. Verwendet habe ich das built-in-WiX RegistrySearch, um zu bestimmen, wenn es installiert ist. Ich hatte zu verweisen WixUtilExtension.dll in meiner Bundle-Projekt. Hier ist die aktualisierte Bundle.wxs:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
    xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension"
    xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"
>
    <Bundle
        Name="MyProgramBootstrapper"
        Version="1.0.0.0"
        Manufacturer="Microsoft"
        UpgradeCode="{2299B51D-9FD8-4278-90C8-2B79DB37F402}">

        <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" />
        <Chain>
            <PackageGroupRef Id="Netfx4Full"/>
            <!-- TODO: Define the list of chained packages. -->
                  <!-- <MsiPackage SourceFile="path\to\your.msi" /> -->
            <MsiPackage
                Id="MyProgramInstaller"
                SourceFile="$(var.MyProgramInstaller.TargetPath)"
                Compressed="no"  />
        </Chain>
    </Bundle>

    <Fragment>
        <util:RegistrySearchRef Id="NETFRAMEWORK40"/>
        <PackageGroup
            Id="Netfx4Full">

            <ExePackage
                Id="Netfx4FullExe"
                Cache="no"
                Compressed="no"
                PerMachine="yes"
                Permanent="yes"
                Vital="yes"
                SourceFile="C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages\DotNetFX40\dotNetFx40_Full_x86_x64.exe"
                InstallCommand="/q /norestart /ChainingPackage FullX64Bootstrapper"
                DetectCondition="NETFRAMEWORK40"
                DownloadUrl="http://go.microsoft.com/fwlink/?LinkId=164193"/>
        </PackageGroup>
    </Fragment>
</Wix>
  • Wenn ich deine Frage Lesen richtig, ich denke, der Titel deiner Frage ist irreführend. Das Problem ist nicht, dass WixNetfxExtension nicht arbeiten. Das Problem ist, dass Sie wollen, etwas zu tun, dass ist nicht unterstützt von WixNetfxExtension heute. Ein aussagekräftigerer Titel für andere sein könnten: "Wie gehören die .NET Framework komprimiert in einem Bundle". Wenn unten meine Antwort ist völlig falsch, fühlen Sie sich frei, zu ignorieren Sie diesen Kommentar. 🙂
  • richtig, der Titel war irreführend. Ich bin in der Lage zu zählen die instaler lose/neben der exe-Datei, die ist, was ich will. aber meine Bedingungen sind nicht zu erkennen, ob .NET bereits installiert ist, und ich bin nicht sicher, warum.
  • Anstatt die Antwort in der Frage könnte man genauso gut legen Sie es als eine Antwort. Das ist sehr viel unterstützt werden Stackoverflow. (Es ist schwieriger zu sehen, dass es ist ein embedded-Antwort in der Frage Lesen, ohne die ganze Sache statt der Navigation durch die tatsächlichen Antworten)
Schreibe einen Kommentar