从EXE更新已安装的MSI版本

Update Installed MSI Version from EXE(从EXE更新已安装的MSI版本)
本文介绍了从EXE更新已安装的MSI版本的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经创建了一个通过MSI安装的应用程序,版本号为X.X.X-假设是1.0.0。接下来,我们创建了一个不使用MSI形式的自定义自我更新流程。(我们正在通过代码替换文件。)此自定义自我更新流程是必需的,使我们能够远程快速地管理大量用户。我们已经运行了一段时间了。有一件事困扰着我,我们应用程序的程序和功能屏幕上显示的版本仍然是1.0.0。是否有办法从主可执行文件更新程序版本?

推荐答案

将备注改为答案以提高可读性,并对您的问题和有关环境的事实进行讨论:

首先让我们看看您关于更改中DisplayVersion的值的建议

HKEY_LOCAL_MACHINESOFTWAREWow6432NodeMicrosoftWindowsCurrentVersionUninstall{MSI ProductCode}

对于32位MSI安装程序(大多数安装程序仍然在这里运行,即使通常包含64位或独立(例如.NET)代码,但这是另一回事)或

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstall{MSI ProductCode}

用于64位MSI设置。首先,这只是机器范围("LOCAL_MACHINE")设置的位置,不适用于用户相关的设置,但这没问题,因为这是标准设置。

编辑DisplayVersion不是最佳做法。至少,如果要编辑它,它可以受到讨论的影响。事实上,它是一个免费的字符串,许多安装程序都在使用它,他们称自己的版本不是"1.0",而是"V1.0"或"1.0a"或类似的版本。 如果执行此操作,则在MSI本身的自定义操作中执行此操作(在最后)不是最糟糕的。

至少,对于那些呼吁禁止更改这个键的人来说,这是一个反对的论点:这不是MSI逻辑上操作版本的地方,这个版本不用于版本比较。事实上,它只是一个输出字符串。

OTOH,它可以再次被原始安装(MSI)修复/更新/重新安装覆盖。因此,警告不要手动更改是有背景的。

此外: 有一些Windows版本,特别是较旧的版本,存在更新问题,因此更改注册表值不会立即反映控制面板视图。例如,有一个保存所有安装条目的ARP缓存。我预计Windows 7或更高版本不会出现这些问题,但我过去看到过这些问题,而且知道ARP缓存仍然存在,这让我在这里保持谨慎。

我建议的是不要更改此号码,而是让它属于本机MSI。

我会称之为良好实践。

在控制面板中安装使MSI设置对用户不可见("程序和功能"或ARP我们在MSI和安装社区中仍然这样称呼它,因为它的名称较旧):

将MSI修复中的ARPSYSTEMCOMPONENT属性设置为1(通常为十六进制1,但因为是您,您只能选择十进制1:-))。

或在安装时将ARPSYSTEMCOMPONENT=1作为命令行参数提供给所需的任何MSI安装程序。

事实上,这就是Microsoft正在对SQL服务器、Visual Studio、Office安装程序所做的事情。它们由多个设置组成,这些设置的行为类似于不可见(设置)组件。

或者,您也可以在安装后使(任何)MSI安装程序"看不见":只需将注册表中的SystemComponent更改(或直接添加)为1即可。 但这是不干净的,再次,因为修复、更新或重新安装可能会再次更改这一点。但它不会破坏任何东西--在最坏的情况下,看不见的设置将变得可见。

然后为可视ARP设置构建另一个安装程序(可能是"主"安装程序),或者只需在注册表中上述"卸载"键下创建一个完整的MSI独立键。(在程序中或在"正常"的MSI设置中)。这可以是GUID或普通名称。查看您的注册表,您会发现许多非GUID的示例,例如Adobe等。每个非GUID都不是"Windows Installer"(MSI)设置,但当然也有一些类似GUID的条目可能是由非MSI设置的。

主要优点是:MSI无关密钥中的这个新DisplayVersion可以由您自己控制。

这篇关于从EXE更新已安装的MSI版本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

DispatcherQueue null when trying to update Ui property in ViewModel(尝试更新ViewModel中的Ui属性时DispatcherQueue为空)
Drawing over all windows on multiple monitors(在多个监视器上绘制所有窗口)
Programmatically show the desktop(以编程方式显示桌面)
c# Generic Setlt;Tgt; implementation to access objects by type(按类型访问对象的C#泛型集实现)
InvalidOperationException When using Context Injection in ASP.Net Core(在ASP.NET核心中使用上下文注入时发生InvalidOperationException)
LINQ many-to-many relationship, how to write a correct WHERE clause?(LINQ多对多关系,如何写一个正确的WHERE子句?)