[英]Multiple Windows Services in One exe
我正在嘗試構建幾個Windows服務來做不同的事情。 例如,我需要Windows服務,它將:
我需要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運行兩個服務,我有什么遺漏嗎?
我已經弄清楚如何有一個可執行文件,但有兩個服務。 每個服務都以自己的名稱和啟動/停止的能力安裝到服務管理器。 我想這就是你想要的,對嗎? 這是我做的:
你可以在這里找到演示代碼:
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了嗎? 這聽起來非常適合您的需求。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.