1

在测试我们的一个 WiX 构建的 MSI 的降级功能时,我注意到了一些奇怪的事情。

我已允许MajorUpgrade元素中的降级,并且我已将该元素安排为afterInstallInitialize(但我已经用afterInstallValidate彻底尝试过,我遇到了同样的问题;我们不能在该操作之后拥有它,但我想我会测试它)。

许多文件(例如我们服务的 bin 文件夹中的 DLL)都是更高版本的,每个版本都有;因此,我们降级到的版本包含较低版本的文件。然而,在降级期间,除了服务 EXE 文件之外,所有这些文件都安装得很好;此外,服务也未安装在 Windows 中。

考虑到以上所有,在这个问题上花了两天时间,经过大量搜索,我似乎不知所措。

我尝试了两件事似乎带来了一些希望:

1) 我尝试将REINSTALLMODE属性设置为amus。这可确保安装 EXE 文件以及 Windows 服务。但是我读到的关于该属性的大多数内容都警告不要使用它,我什至必须在设置该属性时取消 ICE40才能构建我的包。这一切都与我有关,因为我不确定如果我在我的 MSI 文件中使用此属性会遗漏哪些负面影响。

2)当我从标记服务 EXE 文件的File元素中删除KeyPath属性并将该属性放在Component元素上时,降级期间将服务 EXE 文件安装到系统上,但服务仍未安装在视窗。调查后,如果我想安装服务,似乎KeyPath属性必须在File元素上。所以在我看来,这个想法似乎无济于事。

任何帮助或建议将不胜感激。我们真的可以提供降级功能。

谢谢大家的时间。

4

3 回答 3

0

MSI本质上反对降级的想法。一旦文件在计算机上,MSI 会非常努力地保留文件的最新版本,除其他原因外,降级文件可能会重新引入安全漏洞。我建议不要直接支持降级;相反,您可以显示一条消息,告诉用户先卸载更高版本。

于 2012-09-13T17:34:51.680 回答
0

我的解决方案是使用 Burn 通过自定义引导程序应用程序提供“降级”功能。

引导程序检测、下载并安装新版本。在降级的情况下,它会在安装之前执行卸载。但是,这需要您执行当前安装版本的引导程序才能获得卸载能力。

然后,您还需要担心由于卸载而被删除的任何状态,这需要像升级期间一样保留。

于 2015-09-01T00:29:28.920 回答
0

使用 Wix,要允许降级并在降级时仍然正确安装 Windows 服务,请使用以下组合:

<Wix ...>
  <Product ...>
    <Property Id="REINSTALLMODE" Value="amus" />
    <MajorUpgrade Schedule="afterInstallInitialize" AllowDowngrades="yes" />

我还使用WixSharp生成 .wxs 文件并使用此代码执行此操作:

// https://docs.microsoft.com/en-us/windows/win32/msi/reinstallmode
// a = Force all files to be reinstalled, regardless of checksum or version.
// m = Rewrite all required registry entries from the Registry Table that go to the HKEY_LOCAL_MACHINE or HKEY_CLASSES_ROOT registry hive. Rewrite all information from the Class Table, Verb Table, PublishComponent Table, ProgID Table, MIME Table, Icon Table, Extension Table, and AppID Table regardless of machine or user assignment.Reinstall all qualified components.When reinstalling an application, this option runs the RegisterTypeLibraries and InstallODBC actions.
// u = Rewrite all required registry entries from the Registry Table that go to theHKEY_CURRENT_USER or HKEY_USERS registry hive.
// s = Reinstall all shortcuts and re-cache all icons overwriting any existing shortcuts and icons.
project.AddXml("Wix/Product", "<Property Id=\"REINSTALLMODE\" Value=\"amus\" />");

// Allow downgrading versions
// https://wixtoolset.org/documentation/manual/v3/xsd/wix/majorupgrade.html
project.AddXml("Wix/Product", "<MajorUpgrade Schedule=\"afterInstallInitialize\" AllowDowngrades=\"yes\" />");

也可以看看:

于 2021-03-16T17:19:54.053 回答