从EXE更新已安装的MSI版本

时间:2015-01-28 15:00:18

标签: c# .net windows-installer versioning

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

3 个答案:

答案 0 :(得分:1)

从评论变为答案以获得更好的可读性,并将事实讨论与您的问题和环境相关:

首先,让我们看看您在

中更改DisplayVersion值的建议
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{MSI ProductCode}

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

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{MSI ProductCode}

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

编辑DisplayVersion不是最佳做法。至少,它可以进行讨论,如果要进行编辑。事实上,它是一个免费的字符串,并且有许多设置使用它,称其版本不是" 1.0",但" V1.0"或" 1.0a"或类似的。 如果这样做,那么在msi本身(最后)的自定义动作中执行此操作的效果最差。

至少,作为反对那些调用禁止更改此密钥的人的论据:这不是MSI在逻辑上与版本一起运行的地方,此版本不用于版本比较。实际上它只是一个输出字符串。

OTOH,它可以通过原始设置(MSI)修复/更新/重新安装再次覆盖。所以警告不要手动更改有背景。

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

我推荐的,我称之为良好的做法,是不改变这个数字,但让它归属于原生MSI。

Instad使控制面板中的用户无法进行MSI设置("程序和功能"或 ARP 我们如何在MSI和设置社区中调用它,因为它'更老的名字):

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

或者在安装时将ARPSYSTEMCOMPONENT=1作为命令行参数提供给您想要的任何MSI设置。

事实上,这也是微软在SQL服务器,Visual Studio,Office设置方面所做的事情。它们由多个设置组成,其行为类似于不可见(设置)组件。

或者你可以进行(任何)MSI设置"隐形" 安装后:只需将注册表中的注册表值SystemComponent(或添加)直接更改为1即可。 但这不是干净的,再次,因为修复或更新或重新安装可能会再次改变这种情况。但它不会破坏任何东西 - 最坏的隐形设置会变得可见。

然后,您为可视化ARP设置构建另一个设置(可能是"主要"设置),或者您只需在注册表中的#34;卸载"下创建一个完整的MSI独立密钥。上面提到的关键。 (在程序中或正常" MSI设置中)。这可以是GUID或普通名称。查看您的注册表,您可以找到许多非GUID的示例,例如:每个非GUID都不是" Windows Installer" (MSI)设置,但当然也有一些类似GUID的条目可以通过非MSI设置。

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

答案 1 :(得分:0)

您正在尝试重新修改补丁。 Windows Installer不支持此操作,并且无法执行您要执行的操作。

更新:Tao of the Windows Installer, Part 2

  

规则21:避免使用您不拥有的配置数据

     

作为安装程序初始设计的一部分,一致性   通过Microsoft获得代码的所有权来实现安装   用于安装引擎。这包括所有的位置和格式   配置数据。此数据由安装程序和直接管理   不鼓励用户或应用程序访问;实际上是一些   对数据进行编码以使其难以手动操作。

     

您不应该试图直接窥视Windows Installer   配置信息。而是使用Windows Installer API   获取您需要的信息。以这种方式访问​​数据可确保这一点   您的包裹或申请将继续工作即使   基础配置数据更改位置或格式。

在这种情况下,API为MsiGetProductInfo function。此函数返回INSTALLPROPERTY_VERSIONSTRING,即ProductVersion property。此API没有设置ProductVerion的机制,因为MSI在PublishProduct Action期间在内部执行此操作。如果你查看注册表,你会在HKCR \ Installer \ Products \ PackedGuid \ Version下找到它。 Packed Guid是DWORD格式的ProductCode的“Darwin转换”。 ProductVersion以DWORD格式存储,1字节用于Minor的1字节和2字节的构建。这是因为ProductVersion会忽略第4个字段,尽管它存储在ARP中。

为了鼓励规则21,请注意此注册表结构。不要将Windows Installer配置数据弄得乱七八糟。让MSI处理它。

答案 2 :(得分:-1)

可以通过修改位于两个位置之一的已安装应用程序的注册表值来更新MSI已安装版本。在我的Windows 8 PC上,它位于以下位置:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{MSI-GUID}

它也可能位于: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{MSI-GUID}

要更新“程序和功能”屏幕上显示的版本号,请修改注册表值“DisplayVersion”