2017-08-03 135 views
0

我正在使用MSI安装程序升级我的自定义Windows服务。我使用C#代码启动MSI进程,首先卸载该服务,然后安装新版本。使用MSI安装程序升级服务

我需要确保在MSI开始安装新版本之前,先前版本被卸载。如何在c#中添加此检查?

+0

如果使用[设置扩展(https://marketplace.visualstudio.com/items?itemName=VisualStudioProductTeam.MicrosoftVisualStudio2015InstallerProjects)在Visual Studio中会出现安装新 –

+0

之前卸载以前的应用程序/服务的动作你应该说你正在使用什么工具。 VS安装项目使用安装程序类,其他工具使用内置的Windows安装程序功能。 – PhilDW

+0

我正在使用InstallSheild ..此问题发生的原因是,当MSI可以从注册表中删除SERVICE时,我的代码开始安装它的新版本。 因此,MSI会从机器注册表中删除该服务,但由于此过程中存在时间延迟,所以新版本安装失败。为了解决这个问题,我现在使用** sc query servicename **在服务存在的时候检查服务是否存在我正在执行'thread.sleep(1000)' –

回答

1

我推荐使用WIX来做到这一点。 MSI周围的包装http://wixtoolset.org/documentation/

确保将版本增加为最佳做法。

关键是增加版本属性 set AllowSameVersionUpgrades =“yes”并且不会更改UpgradeCode =“[您的唯一升级代码]”。确保UpgradeCode属性保持不变,它必须是静态的,所以不应该设置为*,这将生成随机的GUID。

<MajorUpgrade AllowSameVersionUpgrades="yes" DowngradeErrorMessage="A newer version of [ProductName] is already installed." />

<Product 
Name="Sample" 
Id="*" 
UpgradeCode="4c79fec3-a6b7-46eb-90d6-46688a7f1662" 
Manufacturer="Sample" 
Version="0.1.3.0" 
Language="1033"> ... /> 

你的问题是如何做到这一点在C#

检查注册表键HKLM:\ SOFTWARE \微软\的Windows \ CurrentVersion \卸载\

SC查询,你可能只想用C#代码替换那部分。我强烈建议不要使用大多数内置的Windows命令行程序。

0

我使用InstallSheild .. 此问题是由时间,因为发生了MSI安装程序会从注册表中删除服务,我的代码开始安装它的新版本。

因此MSI确实从机器注册表中删除了该服务,但由于此过程中的时间滞后,新版本安装失败。这主要发生在服务器机器上。不知道它的原因。

为了解决这个问题,我同时服务存在我做thread.sleep(1000)

请分享如果有一个更好的办法利用sc query servicename现在检查服务存在安装之前。但是我必须仅使用InstallSheild来完成。

相关问题