问题描述
我已经创建了一个通过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即可。
但这是不干净的,再次,因为修复、更新或重新安装可能会再次更改这一点。但它不会破坏任何东西--在最坏的情况下,看不见的设置将变得可见。
主要优点是:MSI无关密钥中的这个新DisplayVersion
可以由您自己控制。
这篇关于从EXE更新已安装的MSI版本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!