使用MSI安装程序升级服务

时间:2017-08-03 09:27:41

标签: c# windows-installer

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

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

2 个答案:

答案 0 :(得分:1)

我建议使用WIX来执行此操作。 MSI http://wixtoolset.org/documentation/

周围的包装器

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

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

Function percentage(f, s, t) Dim id, l, k, y k = 2 id = f l = s y = t If id <> 0 Then If l > 5 And l < 9 Then While IsEmpty(Sheet7.Cells(k, 1).Value) = False If Sheet7.Cells(k, 1).Value = id Then id = Sheet7.Cells(k, 11).Value If l = 6 Then Sheet7.Cells(k, l).Value = 0.03 * Sheet7.Cells(y, 3).Value l = l + 1 ElseIf l = 7 Then Sheet7.Cells(k, l).Value = 0.02 * Sheet7.Cells(y, 3).Value l = l + 1 ElseIf l = 8 Then Sheet7.Cells(k, l).Value = 0.01 * Sheet7.Cells(y, 3).Value l = l + 1 End If End If k = k + 1 Wend percentage = percentage(id, l, y) End If End If End Function

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

您的问题是如何在C#中执行此操作

检查注册表项HKLM:\ Software \ Microsoft \ Windows \ CurrentVersion \ Uninstall \

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

答案 1 :(得分:0)

我正在使用 InstallSheild .. 发生此问题是因为MSI安装程序可以从注册表中删除SERVICE时,我的代码开始安装它的新版本。

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

要解决此问题,我现在正在使用sc query servicename检查服务是否存在,因此服务存在时我在做thread.sleep(1000)

请分享更好的方法。但我必须仅使用InstallSheild来完成它。