簡體   English   中英

如何使用WiX安裝PeterKottas.DotNetCore.WindowsService?

[英]How do I use WiX to install PeterKottas.DotNetCore.WindowsService?

我已經在DotNet Core中構建了一個Windows服務,該服務與Peter Kottas WindowsServer nuget( https://github.com/PeterKottas/DotNetCore.WindowsService )一起安裝。 為了安裝該服務,您必須發布代碼,將其部署到任何地方,以管理員權限運行cmd提示符,將目錄移至已部署的代碼並執行以下行:“ MyService action:install”

<CustomAction Id="CallCmd" Value="[SystemFolder]cmd.exe" Directory="MYSERVICE" />
<CustomAction Id="MoveDirectory" Directory="MYSERVICE" ExeCommand="cd C:\Program Files (x86)\MYCOMPANY\MYSERVICE"/>
<CustomAction Id="CA_InstallMyService" Directory="MYSERVICE" ExeCommand="MyService action:install" />

<InstallExecuteSequence>
  <Custom Action="CallCmd" After="PublishProduct" />
  <Custom Action="MoveDirectory" After="CallCmd" />
  <Custom Action="CA_InstallMyService" After="MoveDirectory" />
</InstallExecuteSequence>

在Orca中查看時,它似乎處於正確的順序,因為這些說明只有在創建文件夾后才能瀏覽到該文件夾​​。

在此處輸入圖片說明

但是,在執行MSI並單擊“安裝”后,它進入一半,失敗,並在安裝過程中向后運行。 (我嘗試查看“ Program Files(x86)”目錄,甚至看不到正在創建的Product.wxs中所述的目錄文件夾結構。

在事件查看器中進行一些挖掘會發現此錯誤:

錯誤1721。Windows Installer軟件包存在問題。 無法完成該安裝所需的程序。 請與您的支持人員或包裝供應商聯系。 操作:MoveDirectory,位置:C:\\ WINDOWS \\ SysWOW64 \\ cmd.exe \\,命令:cd C:\\ Program Files(x86)\\ MYCOMPANY \\ MYSERVICE

考慮到Windows Installer(和WiX)對安裝服務以及啟動和停止它們的內置支持,因此這不是一個好的設計范例,因此可以替換或卸載它們。 nuget可能是一種有趣的服務模型,但是,建議不要使用Windows Installer來啟動,停止和部署服務。 根本不需要運行代碼。

請參閱WiX ServiceInstall和ServiceControl元素。

您必須將CustomActions標記為Execute="Deferred"

InstallExecuteSequence分兩部分進行,第一部分是計划階段,在此階段確定要執行的工作,第二部分是運行剛剛在提升的上下文中創建的計划腳本。

如果您在InstallExecuteSequence中計划一些自定義操作,但不將其標記為延遲,則它們將在執行順序的計划部分(即安裝任何文件之前)運行,因為InstallFiles標准操作需要提升,並且在第二次發生運行計划腳本時序列的一部分。

通常,當需要運行需要安裝中的屬性值的提升的自定義操作時,便會使用此模式。 您計划兩個自定義操作,一個自定義操作,一個不延遲,非延遲操作實際上會設置一些特殊值,以供延遲操作在執行時使用。

我之前沒有為CustomActions使用過Directory屬性,因此您可能需要重寫其中一些操作才能使它們起作用,我不確定。

如果您需要更改自定義動作的工作方式,則另一個問題的答案應該可以幫助解釋一下自定義動作如何在運行時從安裝程序的屬性中獲取值。

WiX-提交多個屬性以延遲自定義操作

盡管我同意PhilDW提供的答案,即處理Windows服務的最理想方法是使用WiX提供的功能,但是這里的問題是DotNetCore設計為多平台,並且目前不包含任何.Net。 Windows服務的標准程序集,因此為什么我使用Peter Kottas的nuget包來實現Windows服務。 一種解決方法是使用docker容器-但是,這超出了當前版本的范圍,因此這是我克服此問題的方法:

TLDR:當用戶退出應用程序時,我通過CustomAction調用了安裝命令。 這需要管理權限,因此已在MSI中設置了適當的標志,並且始終使用Bootstrapper(Burn)應用程序運行MSI,以便以用戶友好的方式賦予這些權限。

首先,我創建了一個自定義操作以在命令提示符下觸發install命令。

<CustomAction Id="CA_InstallService" Directory="INSTALLDIR" Return="ignore" ExeCommand="cmd /s /c &quot;MyService action:install start-immediately:false&quot;" />

然后,我創建了一個新的WiX UI元素。 它的WixUI_Mode是“ FeatureTree”,我在退出對話框中添加了一個額外的“ DoAction”屬性,以在用戶單擊“完成”時調用customaction。

<Publish Dialog="ExitDlg" Control="Finish" Event="DoAction" Value="CA_InstallService" Order="990"></Publish>

安裝程序需要管理員權限才能調用此命令,因此在Product.wxs文件中,將Package元素上的“ InstallPrivileges”屬性設置為“ elevated”。 現在,如果您通過具有管理員權限的命令提示符調用msi,則將成功調用“ action:install”。 或者,您可以創建一個引用wix安裝程序的引導程序項目,並在“ MsiPackage”上的Bundle.wxs文件中將“ ForePerMachine”屬性設置為“ yes”。

請參閱評論,了解我的一些松散相關的旁注。

暫無
暫無

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

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