簡體   English   中英

無法更新 MSI 安裝的 Windows 服務

[英]Cannot update a Windows Service installed by MSI

我面臨一個奇怪的問題,我找不到可行的解決方案。 在此先感謝您的幫助。

我在 C# 中開發了一個 Windows 服務,它使用 Newtonsoft.JSON 庫來解析來自一堆 WebAPI 的結果。 該服務與 MSI 一起部署,一切正常。

該服務的第一個版本使用的是 Newtonsoft.JSON 6.0.8,但最近我轉移到了 11.0.2 版本。

我打包了一個新的 MSI(具有正確的版本/產品 ID/升級 ID 以確保升級),並且我正在嘗試通過一個執行以下操作的小型安裝應用程序來部署新版本:

  1. 使用 System.ServiceProcess.ServiceController 停止服務(如果已安裝並正在運行)
  2. 使用System.ServiceProcess.ServiceController卸載服務
  3. 在新的 msi 文件上運行一個調用 msiexec 的System.Process

結果:服務不工作,從日志中可以看出應用程序仍在尋找6.0.8版本的Newtonsoft.JSON。

如果我嘗試以下操作:

  1. 右鍵單擊 msi -> 卸載
  2. 右鍵單擊 msi -> 安裝

一切正常,該服務使用庫的 11.0.2 版...

我快要瘋了……我該如何修復/清理升級過程?

提前致謝

摘要:修改和擴展您的 MSI 以處理所有與服務相關的任務: service installationservice deletionservice control 使用內置的 MSI 構造來執行此操作。


服務安裝:不確定我是否遵循了整個問題場景描述,但問題是在安裝和升級過程中,您應該讓 MSI 自己控制服務安裝和服務控制。 服務通過ServiceInstallServiceControl表在 MSI 文件中安裝和控制 - 直接映射到 WiX XML 元素,如下所示:

<Component>
   <File Source="$(var.SourceDir)\WindowsService.exe" />
   <ServiceInstall Name="MyService" ErrorControl="normal" Start="auto" Type="ownProcess" />
   <ServiceControl Id="MyService" Name="MyService" Start="install" Stop="both" Remove="uninstall" Wait="yes" />
</Component>

如果上面不清楚, 讓我鏈接到 github 上的一個類似示例(由Rainer Stropek 提供)。 它更完整和詳細。


鏈接:此答案討論了相同的問題: 服務安裝和控制 使用自定義操作或自定義可執行文件來處理服務控制和安裝或卸載被認為是一種部署反模式- 它既不必要,也不可取,也不可靠。 MSI 功能齊全且可靠,一旦使用正確(除非您有一項非常特殊和不尋常的服務, “出於某種原因”需要自定義操作。更正,新的更正如下: “出於某些非常好的原因” )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM