我正在使用MSI安裝程序升級我的自定義Windows服務。我使用C#代碼啓動MSI進程,首先卸載該服務,然後安裝新版本。使用MSI安裝程序升級服務
我需要確保在MSI開始安裝新版本之前,先前版本被卸載。如何在c#中添加此檢查?
我正在使用MSI安裝程序升級我的自定義Windows服務。我使用C#代碼啓動MSI進程,首先卸載該服務,然後安裝新版本。使用MSI安裝程序升級服務
我需要確保在MSI開始安裝新版本之前,先前版本被卸載。如何在c#中添加此檢查?
我推薦使用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命令行程序。
我使用InstallSheild .. 此問題是由時間,因爲發生了MSI安裝程序會從註冊表中刪除服務,我的代碼開始安裝它的新版本。
因此MSI確實從機器註冊表中刪除了該服務,但由於此過程中的時間滯後,新版本安裝失敗。這主要發生在服務器機器上。不知道它的原因。
爲了解決這個問題,我同時服務存在我做thread.sleep(1000)
請分享如果有一個更好的辦法利用sc query servicename
等現在檢查服務存在安裝之前。但是我必須僅使用InstallSheild來完成。
如果使用[設置擴展(https://marketplace.visualstudio.com/items?itemName=VisualStudioProductTeam.MicrosoftVisualStudio2015InstallerProjects)在Visual Studio中會出現安裝新 –
之前卸載以前的應用程序/服務的動作你應該說你正在使用什麼工具。 VS安裝項目使用安裝程序類,其他工具使用內置的Windows安裝程序功能。 – PhilDW
我正在使用InstallSheild ..此問題發生的原因是,當MSI可以從註冊表中刪除SERVICE時,我的代碼開始安裝它的新版本。 因此,MSI會從機器註冊表中刪除該服務,但由於此過程中存在時間延遲,所以新版本安裝失敗。爲了解決這個問題,我現在使用** sc query servicename **在服務存在的時候檢查服務是否存在我正在執行'thread.sleep(1000)' –