سؤال

كيف يمكنني إجراء ترقية كبيرة لمجموعة التثبيت (MSI) التي تم إنشاؤها باستخدام ويكس التثبيت في نفس المجلد مثل التثبيت الأصلي؟

تم اكتشاف التثبيت بشكل صحيح كترقية، ولكن لا تزال شاشة تحديد الدليل ظاهرة وبالقيمة الافتراضية (ليس بالضرورة مجلد التثبيت الحالي).

هل يتعين علي القيام بعمل يدوي مثل حفظ مجلد التثبيت في مفتاح التسجيل عند التثبيت لأول مرة ثم قراءة هذا المفتاح عند الترقية؟إذا كان الأمر كذلك، هل هناك أي مثال؟

أم أن هناك طريقة أسهل لتحقيق ذلك إم إس آي أو ويكس؟

كمرجع، ملف WiX الحالي الخاص بي موجود أدناه:

<?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>
هل كانت مفيدة؟

المحلول

يوجد مثال في البرنامج التعليمي لـ 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>

بالطبع، يجب عليك تعيين مفتاح التسجيل كجزء من التثبيت أيضًا.قم بلصق هذا داخل مكون يمثل جزءًا من التثبيت الأصلي:

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

نصائح أخرى

تم إهمال "التسجيل".الآن يجب أن يبدو هذا الجزء من التعليمات البرمجية كما يلي:

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

لا تحتاج حقًا إلى فصل RegistryKey عن RegistryValue في حالة بسيطة كهذه.كما أن استخدام HKMU بدلاً من HKLM يعتني بالأمر سواء كنت تقوم بتثبيت جهاز أو مستخدم.

<RegistryValue
  Root="HKMU"
  Key="Software\[Manufacturer]\[ProductName]"
  Name="InstallDir"
  Type="string"
  Value="[INSTALLDIR]"
  KeyPath="yes" />
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top