C#判斷程序是由Windows服務啓動仍是用戶啓動

      在Windows系統作網絡開發,不少時候都是使用Windows服務的模式,但在調度階段,咱們更多的是使用控制檯的模式。在開發程序的時候,咱們在Program的Main入口進行判斷。最初開始使用Environment.UserInteractive屬性,在系統不繫統服務的交互模式時,程序運行是正常的,但試過有Win7下,系統容許交互模式,結果在服務啓動的時候,跳轉到控制檯的模式了,服務啓動不起來。只能在服務的調用方式下帶參數,而後在Main的參數中判斷是否爲服務方式。這在通常的狀況下是能夠解決問題的。網絡

      後來有好幾個項目,使用了開源的Socket框架,框架自己是經過配置來啓動服務的,這樣,就沒有通過用戶的Main方法了,啓動帶參數的方法不行了,若是爲了判斷啓動模式而加單獨的配置,不是很好的作法,經過Program加全局標識是能夠解決程序自身啓動同框架啓動的判斷,但服務若是是經過自身的Main啓動,又只能靠加參數的方法了,整個實現感受都是有點彆扭。框架

      在幾回的服務程序開發中,遇到一個寫文件的路徑問題,即取路徑老是不對,經過分析,Windows服務啓動時的環境默認路徑是從System32目錄,多是Windows服務的宿主程序是從這開始的吧,這就有了解決如何判斷啓動模式的方法了。主要是經過宿主程序是程序集所在的目錄來判斷。具體以下 :開發

  string curPath = System.Environment.CurrentDirectory;
  string basePath = Path.GetDirectoryName(System.AppDomain.CurrentDomain.BaseDirectory);
  bool isRunWinService = (curPath != basePath);string

若是兩個路徑不相同,我就認爲是啓動Windows服務了。咱們只要在程序的開始作判斷,這樣Environment.CurrentDirectory的路徑仍是宿主程序,通常來講,開發人員不多去改動Environment.CurrentDirectory的。這樣咱們作好的Exe程序支持用戶啓動,服務啓動,或框架自動的服務管理等模式了。配置

相關文章
相關標籤/搜索