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 vonWixNetfxExtension
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)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Scheint es eine Menge Fragen hier.
Es klingt wie die root Frage ist, wie Sie das NETFX installieren, eingebettet in Ihr Bündel. Wenn dem so ist, Sie sind richtig, dass die
WixNetfxExtension
nicht unterstützt, dass heute. Sie definieren Ihre eigene Kopie, und Ihre Kopie ist in der Nähe (vielleicht kopiert von dem, was in dersrc\ext\NetFxExtension\wixlib
). Das einzige, was Sie ändern müssen, um die NETFX eingebettet in deinem Bündel ist, um dieExePackage/@Compressed
Attribut'yes'
. Oder Sie verlassen konnte, dieCompressed
Attribut aus, und es Folgen die Komprimierung IhrerBundle
element (standardmäßig'yes'
).Zweite, die
DetectCondition
hat festzustellen, ob das Paket auf der Maschine. Brennen tun die logischen Dinge basierend auf, ob das Paket auf der Maschine. Zum Beispiel, während der Installation zu Brennen, wird die Installation des Pakets, wenn das Paket nicht vorhanden ist, aber nichts tun, wenn das Paket bereits vorhanden ist. Natürlich fehlen und dauerhafte Pakete, die Anfragen ignorieren zu deinstallieren.Dritte, die
InstallCondition
zeigt an, ob das Paket sollte immer auf dem Rechner installiert sein. Wenn es zu true ausgewertet, dann wird das Paket installiert werden kann (falls nicht vorhanden und auf Wunsch installiert). Wenn es zu false ausgewertet wird das Paket entfernt wird (falls vorhanden).RegistrySearchRef
element, nicht einePropertyRef
element. Das Burn-log in %TEMP% ein, und du hast post ein snippet von ihm. Irgendwo höher sollte es eine Erwähnung der Suche versucht und nicht gefunden... oder vielleicht haben Sie nicht über die Suche tatsächlich verbunden, die in IhrerBundle
.Ich bin mit dem .NET Framework 4.5.2 in dieser Antwort. Zu gehören die .NET Framework als offline-installation:
Gehören ein
PackageGroupRef
element in IhremChain
:Laden Sie das Microsoft .NET Framework 4.5.2 (Offline Installer), und fügen Sie es zu Ihrem Bootstrapper Projekt. (Ich habe es in einem Ordner namens "Resource".)
Fügen Sie den folgenden
Fragment
: