如何使用MSI更新服务

时间:2011-03-15 22:52:30

标签: windows-installer

我安装了一个带有MSI安装程序的Windows服务。我试图让这个安装程序充当“更新程序”,首先让它自己卸载(RemovePreviousVersions = true?),然后重新安装。我理解的方式是,使用RemovePreviousVersions = true,当安装程序第二次运行时,它应该注意到产品的当前版本与已安装的版本不同,它将对已安装的产品执行卸载操作,然后执行在新版本上安装操作。然而,情况似乎并非如此。看来初始卸载步骤永远不会发生,安装程序只是尝试执行安装。这导致了我的问题,因为安装程序自定义操作是服务安装,当然,该服务已经安装,然后抱怨“服务已存在”。

如何让Windows安装程序首先卸载然后再安装服务?也许我对MSI安装程序如何工作有所了解?有没有更好的方法来安装服务?

2 个答案:

答案 0 :(得分:5)

我是这样做的。

设置升级ID GUID(在安装期间必须保持不变):

<?define ProductVersion="3.0.43.0" ?>
<?define UpgradeCode="{3F198E84-0BB6-4765-B48A-64DE5F8C4A65}" ?>

<Product Id='*' Name='...' Language='1033'
         Version='$(var.ProductVersion)' Manufacturer='...'
         UpgradeCode='$(var.UpgradeCode)'>


<Property Id='PREVIOUSVERSIONSINSTALLED' Secure='yes'/>
<Upgrade Id='$(var.UpgradeCode)'>
  <UpgradeVersion Minimum='1.0.0.0'
                  Maximum='$(var.ProductVersion)'
                  IncludeMinimum='yes'
                  IncludeMaximum='no'
                  Property='PREVIOUSVERSIONSINSTALLED'/>
</Upgrade>

然后在服务器组件标签内:

<ServiceInstall Id='server.exe' Name='...' DisplayName='...' Type='ownProcess'
                Interactive='no' Start='auto' Vital='yes' ErrorControl='normal'
                Account='LocalSystem'
</ServiceInstall>
<ServiceControl Id='server_start' Name='...' Start='install' Wait='yes' />
<ServiceControl Id='server_stop' Name='...' Stop='both' Wait='yes' />
<ServiceControl Id='server_remove' Name='...' Remove='uninstall' Wait='yes' />

这会停止正在运行的服务,将其删除,安装新服务并再次启动它。

最后:

<InstallExecuteSequence>
  <LaunchConditions After='AppSearch' />
  <RemoveExistingProducts After='InstallInitialize' />
</InstallExecuteSequence>

答案 1 :(得分:0)

您的执行顺序中是否安排了RemoveExistingProducts?行为因此而异。请参阅操作说明 - http://msdn.microsoft.com/en-us/library/aa371197%28v=vs.85%29.aspx