簡體   English   中英

一個exe中的多個Windows服務

[英]Multiple Windows Services in One exe

我正在嘗試構建幾個Windows服務來做不同的事情。 例如,我需要Windows服務,它將:

  1. 通過電子郵件發送每日報告
  2. 每30分鍾定期清理一些存檔信息
  3. 等等

我需要Windows服務的任務是不同的,所以我不喜歡將它們全部集中在一個服務中的想法。

到目前為止我所擁有的是Visual Studio 2008中的一個項目。我已經創建了一個Windows服務,我在OnStart事件上設置了一個計時器(它只是為了測試目的每5秒寫一個文本文件)。 然后我向項目添加了一個安裝程序,當我運行InstallUtil.exe時,一切正常。

當我向同一個項目添加第二個Windows服務時,問題就出現了。 我再次設置OnStart代碼,使用相同的日志信息(略有不同,以便我可以判斷哪個服務正在寫入日志)。 使用第二個Windows服務,我在Program.cs中更改了Main事件:

    static void Main(string[] args)
    {
        ServiceBase[] ServicesToRun = new ServiceBase[] 
        { 
            new Service1()
        };

        ServiceBase.Run(ServicesToRun);
    }

至:

    static void Main(string[] args)
    {
        ServiceBase[] ServicesToRun = new ServiceBase[] 
        { 
            new Service1(),
            new Service2()
        };

        ServiceBase.Run(ServicesToRun);
    }

此時,沒有編譯時錯誤,但Service2服務從不做任何事情......日志記錄任務永遠不會觸發。

我把它縮小到第二個服務沒有與之關聯的“安裝程序”的事實。 然后,我嘗試按照第一項服務的方式添加安裝程序(即,右鍵單擊服務設計器,然后單擊“添加安裝程序”)。 現在,當我轉到ProjectInstaller.cs文件時,那里有另一個serviceInstaller(serviceInstaller2)。

現在當我構建項目並嘗試安裝服務時,我轉到“服務”控制面板窗口,我嘗試啟動Service1,收到以下錯誤消息:

Windows無法在本地計算機上啟動Service1服務。

錯誤1083:此服務配置為運行的可執行程序未實現該服務。

如果我嘗試啟動Service2,則會收到相同的錯誤消息(當然,錯誤消息標識Service2除外)。

為了從一個exe運行兩個服務,我有什么遺漏嗎?

我已經弄清楚如何有一個可執行文件,但有兩個服務。 每個服務都以自己的名稱和啟動/停止的能力安裝到服務管理器。 我想這就是你想要的,對嗎? 這是我做的:

  1. 創建了一個服務項目。
  2. 為同一項目添加了第二項服務(具有唯一的服務名稱)。
  3. 為兩個服務(ServiceA和ServiceB)添加了安裝程序。
  4. 在ProjectInstaller.Designer.vb文件中,我更改了Me.Installers.AddRange行以顯示兩個服務安裝程序。 (Me.ServiceInstaller1,Me.ServiceInstaller2)
  5. 在主服務的主入口點(在我的例子中是ServiceA),我將ServicesToRun變量設置為ServiceBase數組,其中包含我希望它運行的所有服務(ServiceA和ServiceB)。 這是一個重要的步驟,因為服務管理器根據此處的參數數量設置屬性 - 要么允許同一個exe的多個實例,要么只允許單個實例。
  6. 添加安裝程序項目並使用服務的輸出。
  7. 使用“服務”的輸出添加自定義操作。

你可以在這里找到演示代碼:
http://code.google.com/p/multi-service-install/

請享用!

我想你們已經解決了這個問題,但是如果其他人需要它,我會在這個問題上給出答案,這個問題今天花了我幾個小時。 解決方案不是添加另一個項目安裝程序,而是添加服務安裝程序,它是項目安裝程序的一個組件。 新添加的服務安裝程序必須配置第二個服務名稱。

我今天遇到了類似的問題,並設法解決了這個問題。

首先,我確保每個服務都有一個有意義且唯一的ServiceName屬性。 該生成器為這兩個服務提供了相同的名稱,這些服務沒有幫助。

然后我刪除並重新生成了ProjectInstaller類,並為每個類添加了安裝程序。 我確保它們都是在靜態Main方法中實例化的。

我現在可以使用一個dll安裝這兩個服務,但不幸的是,當我啟動其中一個服務時,它似乎執行自身和其他服務的功能。 也就是說,兩個服務都在運行(即使計算機管理器中只有一個服務顯示為“已啟動”)。 我還在努力想出那個......

我使用sc.exe輕松完成此任務。 http://support.microsoft.com/kb/251192

例如: sc create "My Display Service Name" binpath= "c:\\app\\mysvc.exe --service"

注意:每個相等的值應該在它的值之前有空格 ,因為你可以看到'binpath'

我實際上正在構建一些與你想到的非常相似的東西。 我決定做的(到目前為止)是我的所有'服務'(雖然它們不是服務,'控制器')實現特定的接口(使用init()和execute()操作)作為頻率枚舉)。

控制器是Windows服務,它在運行時從xml設置文件中讀取程序/ dll列表,並將它們加載到List中,並在它們定義的任何頻率上調用它們的execute()方法(如果適用)。

在我的例子中,每個程序還包含一個usercontrol,它被加載到控制器的標簽頁中,允許用戶控制/修改它。 如果你有興趣,我會發布代碼。

不確定這是否清楚。 我實際上從另一個SO用戶那里得到了這個想法,他實現了類似的東西,但我現在找不到那個帖子。

我今天遇到了同樣的問題並設法修復它。 在我的情況下,我只需要打開我的服務的* .designer.cs文件,並確保正確設置服務名稱。 更重要的是,* Installer.Designer.cs中應使用相同的名稱,如果您在* Installer.cs中有代碼。

我認為這個錯誤只是因為名稱不匹配而發生。

希望這會有所幫助

在一個可執行文件中安裝2個不同且不相關的服務對我來說很有趣。 雖然它可以讓它工作,但它並沒有使它正確。

從聽起來,你需要以不同的間隔執行一些不同的任務,你的任務可能相關也可能不相關。 你看過Quartz.NET了嗎? 這聽起來非常適合您的需求。

http://quartznet.sourceforge.net/features.html

暫無
暫無

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

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