簡體   English   中英

如何在不擴展安裝程序的情況下安裝Windows服務?

[英]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.

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