Wix Toolset主要升级不会完全删除以前的版本

问题描述

我已将MajorUpgrade元素添加到msi。增加版本,更改UpgradeCode,ProductId相同。这里看起来像

 <?define Config = "Release" ?>
 <?define ProductId = "{87FEDA58-2732-4BBA-9C1E-B7A9AE1A46F6}" ?>
 <?define UpgradeCode = "{B414C827-8D81-4B4A-B3B6-338C06DE3A11}" ?>
 <?define ProductName = "Some Product" ?>
 <?define Version = "2.0.0.0" ?>
 <?define Company = "Some Inc." ?>
 <?define Description = "Installs Some Product" ?>

在1.0.0.0版中,ProductId是不同的。 MajorUpgrade设置如下

<MajorUpgrade 
      Schedule="afterInstallValidate"
      DowngradeErrorMessage="A newer version of [ProductName] is already installed." 
      AllowSameVersionUpgrades="yes" />

升级过程中,它成功地在FindRelatedProducts阶段标识了以前的版本

Action start 22:31:06: FindRelatedProducts.
MSI (s) (38:78) [22:31:06:557]: PROPERTY CHANGE: Adding WIX_UPGRADE_DETECTED property. Its value is '{3E786878-358D-43AD-82D1-1435ADF9F6EA}'.
MSI (s) (38:78) [22:31:06:557]: PROPERTY CHANGE: Adding MIGRATE property. Its value is '{3E786878-358D-43AD-82D1-1435ADF9F6EA}'.
MSI (s) (38:78) [22:31:06:557]: Doing action: AppSearch
MSI (s) (38:78) [22:31:06:557]: Note: 1: 2205 2:  3: ActionText 
Action ended 22:31:06: FindRelatedProducts. Return value 1.

RemoveExistingProducts开始卸载RemoveFolderEx删除一些文件夹,RemoveExistingProducts阶段返回代码1(成功吗?)。但是它不会删除注册表中的条目。产品仍然在那里。组件无法卸下。这是日志。

Action start 22:35:25: RemoveExistingProducts.
MSI (s) (38:78) [22:35:25:190]: Note: 1: 2205 2:  3: Error 
MSI (s) (38:78) [22:35:25:190]: Note: 1: 2228 2:  3: Error 4: SELECT `Message` FROM `Error` WHERE `Error` = 23 
MSI (s) (38:AC) [22:35:25:190]: Resetting cached policy values
MSI (s) (38:AC) [22:35:25:190]: Machine policy value 'Debug' is 0
MSI (s) (38:AC) [22:35:25:190]: ******* RunEngine:
           ******* Product: {3E786878-358D-43AD-82D1-1435ADF9F6EA}
           ******* Action: 
           ******* CommandLine: **********
MSI (s) (38:AC) [22:35:25:205]: Note: 1: 2265 2:  3: -2147287035 
MSI (s) (38:AC) [22:35:25:205]: End dialog not enabled
MSI (s) (38:AC) [22:35:25:205]: Original package ==> C:\Windows\Installer\bd684.msi
MSI (s) (38:AC) [22:35:25:205]: Package we're running from ==> C:\Windows\Installer\bd684.msi
MSI (s) (38:AC) [22:35:25:221]: APPCOMPAT: Uninstall Flags override found.
MSI (s) (38:AC) [22:35:25:221]: APPCOMPAT: Uninstall VersionNT override found.
MSI (s) (38:AC) [22:35:25:221]: APPCOMPAT: Uninstall ServicePackLevel override found.
MSI (s) (38:AC) [22:35:25:221]: APPCOMPAT: looking for appcompat database entry with ProductCode '{3E786878-358D-43AD-82D1-1435ADF9F6EA}'.
MSI (s) (38:AC) [22:35:25:221]: APPCOMPAT: no matching ProductCode found in database.
MSI (s) (38:AC) [22:35:25:221]: Machine policy value 'disablePatch' is 0
MSI (s) (38:AC) [22:35:25:221]: Machine policy value 'AllowLockdownPatch' is 0
MSI (s) (38:AC) [22:35:25:221]: Machine policy value 'disableLUAPatching' is 0
MSI (s) (38:AC) [22:35:25:221]: Machine policy value 'disableFlyWeightPatching' is 0
MSI (s) (38:AC) [22:35:25:237]: APPCOMPAT: looking for appcompat database entry with ProductCode '{3E786878-358D-43AD-82D1-1435ADF9F6EA}'.
MSI (s) (38:AC) [22:35:25:237]: APPCOMPAT: no matching ProductCode found in database.
MSI (s) (38:AC) [22:35:25:237]: Transforms are not secure.
MSI (s) (38:AC) [22:35:25:237]: Command Line: UPGRADINGPRODUCTCODE={87FEDA58-2732-4BBA-9C1E-B7A9AE1A46F6} CLIENTPROCESSID=2520 CLIENTUILEVEL=3 MSICLIENTUSESEXTERNALUI=1 REMOVE=ALL 
MSI (s) (38:AC) [22:35:25:237]: PROPERTY CHANGE: Adding PackageCode property. Its value is '{0C30C985-B880-4BEF-90B5-52ED8736B108}'.
MSI (s) (38:AC) [22:35:25:237]: Product Code passed to Engine.Initialize:           '{3E786878-358D-43AD-82D1-1435ADF9F6EA}'
MSI (s) (38:AC) [22:35:25:237]: Product Code from property table before transforms: '{3E786878-358D-43AD-82D1-1435ADF9F6EA}'
MSI (s) (38:AC) [22:35:25:237]: Product Code from property table after transforms:  '{3E786878-358D-43AD-82D1-1435ADF9F6EA}'
MSI (s) (38:AC) [22:35:25:237]: Product registered: entering maintenance mode
MSI (s) (38:AC) [22:35:25:237]: Determined that existing product (either this product or the product being upgraded with a patch) is installed per-machine.
MSI (s) (38:AC) [22:35:25:237]: MSI_LUA: nested installation UAC elevation tracks that of parent (is not elevated)
MSI (s) (38:AC) [22:35:25:237]: Product {3E786878-358D-43AD-82D1-1435ADF9F6EA} is admin assigned: LocalSystem owns the publish key.
MSI (s) (38:AC) [22:35:25:237]: Product {3E786878-358D-43AD-82D1-1435ADF9F6EA} is managed.
MSI (s) (38:AC) [22:35:25:237]: MSI_LUA: Credential prompt not required,user is an admin
MSI (s) (38:AC) [22:35:25:237]: PROPERTY CHANGE: Adding ProductState property. Its value is '5'.
MSI (s) (38:AC) [22:35:25:237]: PROPERTY CHANGE: Adding ProductToBeRegistered property. Its value is '1'.
MSI (s) (38:AC) [22:35:25:237]: Package name retrieved from configuration data: 'aep_monolith.msi'
MSI (s) (38:AC) [22:35:25:237]: Note: 1: 2205 2:  3: Error 
MSI (s) (38:AC) [22:35:25:237]: Note: 1: 2262 2: AdminProperties 3: -2147287038 
MSI (s) (38:AC) [22:35:25:237]: Machine policy value 'disableMsi' is 1
MSI (s) (38:AC) [22:35:25:237]: Machine policy value 'AlwaysInstallElevated' is 0
MSI (s) (38:AC) [22:35:25:237]: User policy value 'AlwaysInstallElevated' is 0
MSI (s) (38:AC) [22:35:25:237]: Product {3E786878-358D-43AD-82D1-1435ADF9F6EA} is admin assigned: LocalSystem owns the publish key.
MSI (s) (38:AC) [22:35:25:237]: Product {3E786878-358D-43AD-82D1-1435ADF9F6EA} is managed.
MSI (s) (38:AC) [22:35:25:237]: Running product '{3E786878-358D-43AD-82D1-1435ADF9F6EA}' with elevated privileges: Product is assigned.
MSI (s) (38:AC) [22:35:25:237]: PROPERTY CHANGE: Adding UPGRADINGPRODUCTCODE property. Its value is '{87FEDA58-2732-4BBA-9C1E-B7A9AE1A46F6}'.
MSI (s) (38:AC) [22:35:25:237]: PROPERTY CHANGE: Adding CLIENTPROCESSID property. Its value is '2520'.
MSI (s) (38:AC) [22:35:25:237]: PROPERTY CHANGE: Adding CLIENTUILEVEL property. Its value is '3'.
MSI (s) (38:AC) [22:35:25:237]: PROPERTY CHANGE: Adding MSICLIENTUSESEXTERNALUI property. Its value is '1'.
MSI (s) (38:AC) [22:35:25:237]: PROPERTY CHANGE: Adding REMOVE property. Its value is 'ALL'.
MSI (s) (38:AC) [22:35:25:237]: Machine policy value 'disableAutomaticApplicationShutdown' is 0
MSI (s) (38:AC) [22:35:25:237]: PROPERTY CHANGE: Adding MsiRestartManagerSessionKey property. Its value is '7dad24bc7ce3134db335b2318702e12c'.
MSI (s) (38:AC) [22:35:25:237]: RESTART MANAGER: Session opened.
MSI (s) (38:AC) [22:35:25:237]: PROPERTY CHANGE: Adding MsiSystemRebootPending property. Its value is '1'.
MSI (s) (38:AC) [22:35:25:237]: TRANSFORMS property is Now: 
MSI (s) (38:AC) [22:35:25:237]: PROPERTY CHANGE: Adding PRODUCTLANGUAGE property. Its value is '1033'.
MSI (s) (38:AC) [22:35:25:237]: PROPERTY CHANGE: Adding VersionDatabase property. Its value is '301'.

这是结局

MSI (s) (38:78) [22:39:08:694]: Note: 1: 2205 2:  3: Error 
MSI (s) (38:78) [22:39:08:694]: Note: 1: 2228 2:  3: Error 4: SELECT `Message` FROM `Error` WHERE `Error` = 16 
MSI (s) (38:78) [22:39:08:694]: Note: 1: 2205 2:  3: Error 
MSI (s) (38:78) [22:39:08:694]: Note: 1: 2228 2:  3: Error 4: SELECT `Message` FROM `Error` WHERE `Error` = 21 
MSI (s) (38:78) [22:39:08:694]: Doing action: ProcessComponents
MSI (s) (38:78) [22:39:08:694]: Note: 1: 2205 2:  3: ActionText 
Action ended 22:39:08: RemoveExistingProducts. Return value 1.

最后我得到了

MSI (s) (38:78) [22:42:18:570]: Windows Installer installed the product. Product Name: Some Product. Product Version: 2.0.0.0. Product Language: 1033. Manufacturer: Some Inc.. Installation success or error status: 0.

能帮我吗?我没有任何想法。

解决方法

编写主要升级的最简单方法是不编写尽可能多的GUID。参见this example。甚至不必编写组件GUID,即如果它们包含多个资源,则不要编写它-但要避免这种情况。

例如,这可以轻松进行重大升级:

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Product Id="*" Name="Sample Product" Language="1033" Version="1.0.0.0" Manufacturer="Heath Stewart" UpgradeCode="f10d913e-7669-4962-aa3f-963425ecf10b">
    <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />

    <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
    <MediaTemplate />

    <Feature Id="ProductFeature" Title="SampleProduct" Level="1">
      <ComponentGroupRef Id="ProductComponents" />
    </Feature>
  </Product>

  <Fragment>
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramFilesFolder">
        <Directory Id="INSTALLFOLDER" Name="SampleProduct" />
      </Directory>
    </Directory>
  </Fragment>

  <Fragment>
    <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
      <Component>
        <File Source="$(var.SampleApp.TargetPath)" />
      </Component>
      <Component>
        <RegistryKey Root="HKLM" Key="Software\[Manufacturer]\[ProductName]">
          <RegistryValue Name="InstallDir" Type="string" Value="[INSTALLFOLDER]" />
          <RegistryValue Name="Version" Type="string" Value="[ProductVersion]" KeyPath="yes" />
        </RegistryKey>
      </Component>
    </ComponentGroup>
  </Fragment>
</Wix>

请注意,Product/@Id="*"已编写,并且没有程序包ID。确实没有充分的理由对它们进行硬编码,也不应该。仅Product/@UpgradeCode应该被硬编码,并且仅在根安装文件夹相同的情况下。当组件GUID保持不变时,您不想更改文件夹,反之亦然。它会创建各种各样的共享组件问题,我过去在博客中对此写过很多文章:https://devblogs.microsoft.com/setup/tag/shared-components/