2017-08-03 140 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來完成。

相關問題