2009-07-17 37 views
0

當你創建一個Windwows服務時,你最終得到一個你需要註冊的.exe文件,然後從「服務」管理單元啓動它。.Net服務和Windows應用程序在同一時間?

如果您嘗試執行此.exe文件,您會收到以下消息:「無法從命令行或調試器啓動服務。必須首先安裝Windows Service(使用installutil.exe),然後使用ServerExplorer啓動, Windows服務管理工具或NET START命令。「

是否有可能在服務中設置某些東西,以便當作爲常規.exe運行時,而不是顯示此消息,它會執行一些我們可以在代碼中控制的內容? (比如運行一個Sub Main()或類似的東西,顯然是一個不同的入口點,而不是你在啓動服務時獲得的入口點)

謝謝!
Daniel

+0

您對「Sub Main()」的引用是否意味着您使用了VB?如果是這樣,你可能想標記問題vb.net。 – CoderDennis 2009-07-17 19:11:30

+0

我使用VB,但我不認爲這是特定於VB的。 – 2009-07-17 19:16:48

回答

4

那麼這是可能的,但我不知道這是一個美麗的解決方案:

static void Main() 
{ 
    bool your_condition = ReadRegistry or ReadConfigurationFile; 
    if(your_condition) 
    { 
     ServiceBase[] ServicesToRun; 
     ServicesToRun = new ServiceBase[] 
     { 
      new YourService() 
     } 
     ServiceBase.Run(ServicesToRun); 
    } 
    else 
    { 
     Application.Run(new YourForm()) 
    } 
} 

我沒有測試但我想這會奏效。

1

您可以將您的應用程序作爲單獨的類庫編寫,然後創建一個stub exe來啓動它?

+0

是的,我想到了這一點,這意味着至少有兩個獨立的項目。我想知道的是我是否可以僅使用一個項目來解決這個問題。 – 2009-07-17 19:02:01

0

您可以傳入參數值。

像APP.EXE -UI或APP.EXE - 服務

2

我們傾向於建立我們的相似,弗朗西斯B.但使用條件編譯:

#if DEBUG 
    Application.Run(new YourForm()) 
#else 
    ServiceBase[] ServicesToRun; 
    ServicesToRun = new ServiceBase[] 
    { 
     new YourService() 
    } 
    ServiceBase.Run(ServicesToRun); 
#endif 

這樣可以很容易地測試和調試開發過程中,然後做一個構建部署服務。

我不確定您的問題是否希望它作爲獨立的exe發佈,還是僅僅作爲一種工具來幫助開發和測試。

請注意,順便說一句,您不必在調試版本中包含「application.run()」塊。如果它沒有顯示錶單,那麼在單獨的線程中產生服務的OnStart處理程序時,任何執行無限循環的代碼都可以。

相關問題