[英]How to install Windows service without extending Installer?
我正在建立一個可重用的框架,以使用.NET Framework 構建調度服務 。 我的代碼以庫的形式分發,然后由用戶在控制台應用程序中引用。 在應用程序的主要入口點,要求用戶將控制權轉移到庫中的靜態方法,如果以非交互方式運行,它將開始作業調度,或者讀取命令參數並執行維護任務(如安裝)。
為了使用System.Configuration.Install
命名空間將應用程序安裝為Windows服務,用戶必須向應用程序程序集添加Installer
的類后代,以告知框架如何安裝服務。 我真的寧願做這個一勞永逸庫,但不幸的是安裝程序類必須在應用程序組件。
我現在正在尋找的解決方案包括在庫中定義一個安裝程序類,並要求用戶在公共類中繼承此安裝程序,而無需添加任何其他代碼。 在這種情況下,需要用戶編寫煩人的樣板代碼。
擴展Installer
的替代方法是什么? 我可以以更直接的方式訪問托管安裝框架嗎?
我使用SC.exe注冊服務二進制文件。
這樣做僅將這個存根保留在服務安裝程序類中:
[RunInstaller(true)]
public partial class SoapSenderInstaller : Installer
{
public SoapSenderInstaller()
{
InitializeComponent();
}
}
調用SC.exe很簡單:
sc create MyService binpath= "C:\Path\to\my\MyService.exe" DisplayName= "My Service Display Name" depend= MSMQ start= auto
唯一的陷阱是sc.exe期望其命令行參數的方式:
binpath=[BLANK]"MyService.exe"
編輯
當然,此解決方案無法滿足用戶不必創建任何使其二進制文件成為Windows服務的代碼的要求,因為如果他只是引用您的庫,則仍需要從ServiceBase繼承並實現OnStart()和OnStop()。
我知道您可以向安裝程序添加一些自定義字段,並且如果您使用Installer.CodeEffects.com進行編譯,則在安裝過程中需要用戶輸入。 可能是,通過要求名稱空間或類型名稱作為最終用戶的字符串輸入,您可以在運行時動態加載或調用所需的內容?
在您的情況下,我想不起其他任何事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.