Sono su WiX 3.7 e non riesco a ottenere il semplice < PackageGroupRef Id = "NetFx40Web" /> elemento bundle per funzionare, poiché non porta attraverso il pacchetto di installazione di Net FX o incorporarlo in setup.exe. Ho fatto ricorso a creare il mio pacchetto per questo nel mio file Bundle.wxs
, ma ho ancora problemi. Sembra sempre di provare a installare .NET 4, anche se la macchina ha già installato .NET.Incluso il programma di installazione .NET nel bundle WiX che non rileva se già installato
io non sono molto sicuro della differenza tra InstallCondition e DetectCondition. Penso che InstallCondition sia usato per installare il pacchetto se la valutazione è vera, altrimenti disinstallarlo. Come funziona con cose che sono tipicamente permanenti = sì, come la maggior parte dei prerequisiti? DetectCondition è quasi l'opposto, penso, in quanto controlla se è già presente nel sistema e, in caso affermativo, non lo installa.
Di seguito è riportato il mio file completo Bundle.wxs
che si trova in un progetto Bootstrapper WiX di Visual Studio. Sto tentando di guardare il registro e l'estensione della chiave di registro di .NET 4.0 è lì. Se è presente, non desidero installare .NET 4. e, se non è presente, installarlo. Ma questo non funziona e tenta sempre di installare .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 registro di installazione:
[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
aggiornamento, con la soluzione. Ho usato il WiX RegistrySearch integrato per determinare se è stato installato. Ho dovuto fare riferimento a WixUtilExtension.dll nel mio progetto Bundle. Ecco il Bundle.wxs aggiornato:
<?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>
Se ho letto la tua domanda correttamente, penso che il titolo della tua domanda è fuorviante . Il problema non è che "WixNetfxExtension" non funzioni. Il problema è che vuoi fare qualcosa che non è supportato da "WixNetfxExtension" oggi. Un titolo più descrittivo per gli altri potrebbe essere: "Come includere .NET Framework compresso in un pacchetto". Se la mia risposta qui sotto è completamente sbagliata, non esitare a ignorare questo commento. :) –
@RobMensching, corretto, il titolo era fuorviante. Sono in grado di includere l'instaler libero/adiacente al exe, che è quello che voglio. tuttavia, le mie condizioni non riescono a rilevare se .NET è già installato e non sono sicuro del perché. –
Invece di aggiungere la risposta nella domanda potresti anche aggiungerla come risposta. Questo è molto supportato da StackOverflow. (È più difficile vedere che c'è una risposta incorporata nella domanda senza leggere l'intera cosa invece di sfogliare le risposte effettive) – Default