當我正在寫一個Windows服務,然後打F5我得到的錯誤消息,我必須使用installutil.exe
安裝它,然後運行它。 實際上,這意味着每次我改變了一行代碼:運行Windows服務應用程序而不安裝它
- 編譯
- 切換到開發者命令提示符
- 刪除舊版本
- 安裝新版本
- 啓動服務
這非常不方便。有沒有更好的方法來做到這一點?
當我正在寫一個Windows服務,然後打F5我得到的錯誤消息,我必須使用installutil.exe
安裝它,然後運行它。 實際上,這意味着每次我改變了一行代碼:運行Windows服務應用程序而不安裝它
這非常不方便。有沒有更好的方法來做到這一點?
我通常會將大部分服務實現放入一個類庫中,然後創建兩個「前端」來運行它 - 一個是服務項目,另一個是控制檯或Windows窗體應用程序。我使用控制檯/窗體應用程序進行調試。
但是,您應該瞭解調試體驗與作爲真正服務運行時的環境差異 - 例如,您可能無意中最終依賴於與交互式用戶的會話中運行,或者(對於winforms)消息泵正在運行。
如同另一個控制檯或WinForms應用程序一樣,您無法運行Windows服務。它需要由Windows自己啓動。
如果您沒有像@Damien_The_Unbeliever建議的那樣可以使用基礎架構(這也是我推薦的),您可以從調試位置安裝服務。因此,您只需使用installutil
並將其指向位於/bin/debug
的可執行文件。然後,您從services.msc
開始服務並使用Visual Studio > Debug > Attach to Process
菜單並附加到Windows服務。
您也可以考慮使用Thread.Sleep(10000)
作爲OnStart
調用的第一行,或者Debugger.Break()
以幫助您在服務執行任何工作之前進行附加。不要忘記在發佈前刪除它們。
您可以使用Environment.UserInteractive
變量。實施細節here
我認爲最好的方法是使用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
調試它。