2013-05-09 15 views
8

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

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. :) –

+0

@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é. –

+0

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

risposta

8

Sembra che ci siano molte domande qui.

Sembra che la domanda principale sia come includere l'installazione NETFX incorporata nel pacchetto. Se è così, hai ragione che il WixNetfxExtension non lo supporta oggi. Devi definire la tua copia e la tua copia è chiusa (forse copiata da ciò che è nello src\ext\NetFxExtension\wixlib). L'unica cosa che è necessario modificare per ottenere il NETFX incorporato nel pacchetto è impostare l'attributo ExePackage/@Compressed su 'yes'. Oppure puoi disattivare l'attributo Compressed e seguirà la compressione del tuo elemento Bundle (che per impostazione predefinita è 'yes').

In secondo luogo, lo DetectCondition determina se il pacchetto si trova sulla macchina. Burn eseguirà le operazioni logiche in base al fatto che il pacchetto si trovi sulla macchina. Ad esempio, durante l'installazione Burn installerà il pacchetto se il pacchetto è assente ma non farà nulla se il pacchetto è già presente. Naturalmente, i pacchetti assenti e permanenti ignorano le richieste da disinstallare.

In terzo luogo, InstallCondition indica se il pacchetto deve essere installato sulla macchina. Se viene valutato true, il pacchetto può essere installato (se assente e richiesto di essere installato). Se valuta false, il pacchetto viene rimosso (se presente).

Nota: la ricerca e le condizioni del registro sono leggermente diverse da quelle utilizzate nel set di strumenti WiX per rilevare NETFX.Quanto segue è la rilevazione per netfx l'insieme di strumenti WiX usa:

<util:RegistrySearch 
    Id="NETFRAMEWORK40" 
    Variable="NETFRAMEWORK40" 
    Root="HKLM" 
    Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" 
    Value="Install" 
    Result="value" /> 

Il DetectCondition è poi basta "NETFRAMEWORK40". Questa differenza potrebbe spiegare i problemi che stai vedendo.

+0

In realtà non ho un problema incluso l'installer di NET 40. Il mio problema principale è che le mie condizioni di rilevamento non funzionano correttamente e tenta di installare il pacchetto anche se ha installato .net 4.0 sul sistema. –

+0

Ho aggiornato la mia risposta per includere il rilevamento di NETFX 4 utilizzato dal set di strumenti WiX. –

+0

Dopo aver eliminato le mie ricerche di registro e aver cambiato DetectCondition in NETFRAMEWORK40, tenta ancora di installare .NET4 su una macchina di prova (x64) che già possiede .NET 4 –

2

Sto utilizzando .NET Framework 4.5.2 in questa risposta. Per includere il .NET Framework come un'installazione non in linea:

  1. includere un elemento PackageGroupRef nel Chain:

    <Bundle> 
        <Chain> 
         <PackageGroupRef Id="NetFx452" />   
         <MsiPackage ... /> 
        </Chain> 
    </Bundle> 
    
  2. Download the Microsoft .NET Framework 4.5.2 (Offline Installer), e aggiungerlo al progetto Bootstrapper. (L'ho messo in una cartella denominata "risorsa".)

  3. Aggiungere il seguente Fragment:

    <Fragment> 
        <util:RegistrySearchRef Id="NETFRAMEWORK45"/> 
        <PackageGroup Id="NetFx452"> 
         <ExePackage Id="NetFx452" 
            Cache="no" 
            Compressed="yes" 
            PerMachine="yes" 
            Permanent="yes" 
            Vital="yes" 
            Name="NDP452-KB2901907-x86-x64-AllOS-ENU.exe" 
            SourceFile="Resource\NDP452-KB2901907-x86-x64-AllOS-ENU.exe" 
            DetectCondition="NETFRAMEWORK45" 
            InstallCommand="/q /norestart" />  
        </PackageGroup> 
    </Fragment> 
    
Problemi correlati