2013-05-17 191 views
7

當我正在寫一個Windows服務,然後打F5我得到的錯誤消息,我必須使用installutil.exe安裝它,然後運行它。 實際上,這意味着每次我改變了一行代碼:運行Windows服務應用程序而不安裝它

  1. 編譯
  2. 切換到開發者命令提示符
  3. 刪除舊版本
  4. 安裝新版本
  5. 啓動服務

這非常不方便。有沒有更好的方法來做到這一點?

回答

5

我通常會將大部分服務實現放入一個類庫中,然後創建兩個「前端」來運行它 - 一個是服務項目,另一個是控制檯或Windows窗體應用程序。我使用控制檯/窗體應用程序進行調試。

但是,您應該瞭解調試體驗與作爲真正服務運行時的環境差異 - 例如,您可能無意中最終依賴於與交互式用戶的會話中運行,或者(對於winforms)消息泵正在運行。

1

如同另一個控制檯或WinForms應用程序一樣,您無法運行Windows服務。它需要由Windows自己啓動。

如果您沒有像@Damien_The_Unbeliever建議的那樣可以使用基礎架構(這也是我推薦的),您可以從調試位置安裝服務。因此,您只需使用installutil並將其指向位於/bin/debug的可執行文件。然後,您從services.msc開始服務並使用Visual Studio > Debug > Attach to Process菜單並附加到Windows服務。

您也可以考慮使用Thread.Sleep(10000)作爲OnStart調用的第一行,或者Debugger.Break()以幫助您在服務執行任何工作之前進行附加。不要忘記在發佈前刪除它們。

0

您可以使用Environment.UserInteractive變量。實施細節here

7

我認爲最好的方法是使用Debug指令。下面是一個相同的例子。

#if(!DEBUG) 
    ServiceBase[] ServicesToRun; 
    ServicesToRun = new ServiceBase[] 
    { 
     // Calling MyService Constructor 
      new MyService() 
    }; 
    ServiceBase.Run(ServicesToRun); 
#else 
    MyService serviceCall = new MyService(); 
    serviceCall.YourMethodContainingLogic(); 
#endif 

命中F5並在您YourMethodContainingLogic方法設置Breakpoint調試它。

相關問題