Frage

Wie kann ich ein umfangreiches Upgrade eines mit erstellten Installationssatzes (MSI) durchführen? WiX im selben Ordner wie die Originalinstallation installieren?

Die Installation wird korrekt als Upgrade erkannt, der Verzeichnisauswahlbildschirm wird jedoch weiterhin mit dem Standardwert (nicht unbedingt dem aktuellen Installationsordner) angezeigt.

Muss ich bei der ersten Installation manuelle Arbeiten ausführen, wie z. B. das Speichern des Installationsordners in einem Registrierungsschlüssel und diesen Schlüssel dann beim Upgrade lesen?Wenn ja, gibt es ein Beispiel?

Oder gibt es einen einfacheren Weg, dies zu erreichen? MSI oder WiX?

Als Referenz ist meine aktuelle WiX-Datei unten:

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2003/01/wi">
    <Product Id="a2298d1d-ba60-4c4d-92e3-a77413f54a53"
             Name="MyCompany Integration Framework 1.0.0"
             Language="1033"
             Version="1.0.0"
             Manufacturer="MyCompany"
             UpgradeCode="9071eacc-9b5a-48e3-bb90-8064d2b2c45d">

        <!-- Package information -->
        <Package Keywords="Installer"
                 Id="e85e6190-1cd4-49f5-8924-9da5fcb8aee8"
                 Description="Installs MyCompany Integration Framework 1.0.0"
                 Comments="Installs MyCompany Integration Framework 1.0.0"
                 InstallerVersion="100"
                 Compressed="yes" />

        <Upgrade Id='9071eacc-9b5a-48e3-bb90-8064d2b2c45d'>
            <UpgradeVersion Property="PATCHFOUND"
                            OnlyDetect="no"
                            Minimum="0.0.1"
                            IncludeMinimum="yes"
                            Maximum="1.0.0"
                            IncludeMaximum="yes"/>
        </Upgrade>

        <!-- Useless but necessary... -->
        <Media Id="1" Cabinet="MyCompany.cab" EmbedCab="yes" />

        <!-- Precondition: .NET 2 must be installed -->
        <Condition Message='This setup requires the .NET Framework 2 or higher.'>
            <![CDATA[MsiNetAssemblySupport >= "2.0.50727"]]>
        </Condition>

        <Directory Id="TARGETDIR"
                   Name="SourceDir">
            <Directory Id="MyCompany"
                       Name="MyCompany">
                <Directory Id="INSTALLDIR"
                           Name="Integrat"
                           LongName="MyCompany Integration Framework">
                    <Component Id="MyCompanyDllComponent"
                               Guid="4f362043-03a0-472d-a84f-896522ce7d2b"
                               DiskId="1">
                        <File Id="MyCompanyIntegrationDll"
                              Name="IbIntegr.dll"
                              src="..\Build\MyCompany.Integration.dll"
                              Vital="yes"
                              LongName="MyCompany.Integration.dll" />
                        <File Id="MyCompanyServiceModelDll"
                              Name="IbSerMod.dll"
                              src="..\Build\MyCompany.ServiceModel.dll"
                              Vital="yes"
                              LongName="MyCompany.ServiceModel.dll" />
                    </Component>

                    <!-- More components -->
                </Directory>
            </Directory>
        </Directory>

        <Feature Id="MyCompanyProductFeature"
                 Title='MyCompany Integration Framework'
                 Description='The complete package'
                 Display='expand'
                 Level="1"
                 InstallDefault='local'
                 ConfigurableDirectory="INSTALLDIR">
            <ComponentRef Id="MyCompanyDllComponent" />
        </Feature>

        <!-- Task scheduler application. It has to be used as a property -->
        <Property Id="finaltaskexe"
                  Value="MyCompany.Integration.Host.exe" />
        <Property Id="WIXUI_INSTALLDIR"
                  Value="INSTALLDIR" />

        <InstallExecuteSequence>
            <!-- command must be executed: MyCompany.Integration.Host.exe /INITIALCONFIG parameters.xml -->
            <Custom Action='PropertyAssign'
                    After='InstallFinalize'>NOT Installed AND NOT PATCHFOUND</Custom>
            <Custom Action='LaunchFile'
                    After='InstallFinalize'>NOT Installed AND NOT PATCHFOUND</Custom>

            <RemoveExistingProducts Before='CostInitialize' />
        </InstallExecuteSequence>

        <!-- execute comand -->
        <CustomAction Id='PropertyAssign'
                      Property='PathProperty'
            Value='[INSTALLDIR][finaltaskexe]' />
        <CustomAction Id='LaunchFile'
                      Property='PathProperty'
                      ExeCommand='/INITIALCONFIG "[INSTALLDIR]parameters.xml"'
                      Return='asyncNoWait' />

        <!-- User interface information -->
        <UIRef Id="WixUI_InstallDir" />
        <UIRef Id="WixUI_ErrorProgressText" />
    </Product>
</Wix>
War es hilfreich?

Lösung

Es ist ein Beispiel im Tutorial WiX: http: / /wix.tramontana.co.hu/tutorial/getting-started/where-to-install

<Property Id="INSTALLDIR">
  <RegistrySearch Id='AcmeFoobarRegistry' Type='raw'
    Root='HKLM' Key='Software\Acme\Foobar 1.0' Name='InstallDir' />
</Property>

Natürlich, Sie haben auch den Registrierungsschlüssel als Teil der Installation zu setzen. Halten Sie diese innerhalb einer Komponente, die Teil des ursprünglichen installieren ist:

<RegistryKey
         Key="Software\Software\Acme\Foobar 1.0"
         Root="HKLM">
  <RegistryValue Id="FoobarRegInstallDir"
             Type="string"
             Name="InstallDir"
             Value="[INSTALLDIR]" />
</RegistryKey> 

Andere Tipps

'Registrierung' ist veraltet. Nun, da ein Teil des Code soll wie folgt aussehen:

<RegistryKey Id="FoobarRegRoot"
             Action="createAndRemoveOnUninstall"
             Key="Software\Software\Acme\Foobar 1.0"
             Root="HKLM">
  <RegistryValue Id="FoobarRegInstallDir"
                 Type="string"
                 Name="InstallDir"
                 Value="[INSTALLDIR]" />
</RegistryKey>

Sie nicht wirklich brauchen RegistryKey von Registry in einem einfachen Fall wie diesem zu trennen. Auch nimmt mit HKMU statt HKLM kümmern, ob Sie eine Maschine oder einen Benutzer installieren tun.

<RegistryValue
  Root="HKMU"
  Key="Software\[Manufacturer]\[ProductName]"
  Name="InstallDir"
  Type="string"
  Value="[INSTALLDIR]"
  KeyPath="yes" />
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top