我將從一個例子開始:Apache web服務器(在Windows下)有一個很好的功能:它既可以作爲獨立的應用程序運行(具有當前用戶權限),也可以作爲Windows服務來安裝和運行直接(作爲本地系統帳戶),使用相同的可執行文件。如何製作Windows服務應用程序,以便它可以作爲獨立程序運行?
爲了使應用程序作爲獨立的應用程序運行,它需要做的只是在某些公共類中使用靜態公共Main()。
爲了使應用程序可以作爲服務來安裝和運行,它必須以某種方式實現ServiceBase和Installer類。但是,如果像這樣的應用程序作爲獨立的應用程序運行,它將顯示消息框。
這種類似Apache的操作模式如何實現?我相信解決方案很簡單,但我真的不知道從哪裏開始。
下面的一段代碼用於調用服務。可以修改它以允許獨立使用嗎?
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
static void Main()
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new Service() // defined elsewhere as Service : ServiceBase
};
ServiceBase.Run(ServicesToRun);
}
}
我選擇的語言是C#。目前,我已經將公共代碼抽象爲單獨的程序集(我們稱之爲Library.dll),並且我有兩個可執行文件:Console.exe和Service.exe,分別是獨立的和Windows服務應用程序,而這兩者都只是調用Library.dll的手段。
我的目標是將這兩個可執行文件合併爲一個,它仍然會調用Library.dll。
請注意:Environment.UserInteractive僅用於檢查是否存在圖形桌面會話,並且結果僅用於確定是顯示對話框還是控制檯消息。當作爲允許與桌面交互的服務運行時,UserInteractive也會返回true。真正的檢查是在本地方法中完成的。 – Ishmaeel 2010-10-13 12:17:41
@Ishmaeel:謝謝,好點。不知道這兩種模式有關係。你有一個本地方法的例子可以檢查嗎? – 2010-10-13 22:57:40
顯然,ServiceBase只是調用StartServiceCtrlDispatcher函數(http://msdn.microsoft.com/en-us/library/ms686324(VS.85).aspx)和一個非零返回值(可能)意味着您不作爲服務啓動。當然,作爲一個檢查是沒有用的,因爲它是你想要決定是否執行的操作。我還沒有找到合適的檢查功能。 – Ishmaeel 2010-10-14 10:22:06