我正在使用MSI安装程序升级我的自定义Windows服务。我正在使用C#代码启动MSI进程,首先卸载服务,然后安装新版本。
我需要确保 在MSI开始安装新版本之前,先前版本已卸载 。如何在c#中添加此检查?
答案 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来完成它。