用VS(c#)創建、調試windows service以及部署卸載

http://www.cnblogs.com/limei/archive/2010/07/06/1772332.html

 

 

用VS(c#)創建、調試windows service以及部署卸載

同事問到windows service的東東,現在整理一下,用c#如何創建一個windows service,以及如何調試、部署、卸載。

一、創建windows service

1. 打開VS2008,新建一個Project, Project類型選擇Visual C#-Windows,在Templates中選擇Windows Service, 其他可以默認,點擊OK。

2. 在Solution Explorer中會看到自動產生了三個文件:app.config, Program.cs,Service1.cs,其中app.config可以添加一些自定義的配置信息,供代碼文件使用;Program.cs提供了 Main()方法,作爲程序的人口,一般不需要修改;Service1.cs就是要實現的服務。

3. 雙擊打開Service1.cs,會默認打開Service1.cs[Design],在這個界面可以拖拽一個組件,此外,在Properties中,會 看到一些關於這個service的屬性設置,比如AutoLog(True:使用windows event log記錄該service的日誌;False:用戶可以自定義自己的event Log),CanPauseAndContinue(True:可以處理暫停和繼續該服務的操作;False:不可以處理暫停或者繼續該服務的操 作),ServiceName(用於讓Service Control Manager識別的服務名稱)。

4. 轉到Code視圖,可以看到默認生成了一個構造函數,和兩個需要重寫的方法OnStart和OnStop,我們需要覆寫這兩個方法。下面是簡單重寫了OnStart方法。

   protected override void OnStart(string[] args)
   {
            string path = @"d:/share/test.txt";
            StreamWriter sw;
            sw = new StreamWriter(path);
            foreach (string arg in args) sw.WriteLine(arg);
            sw.Close();
            sw.Dispose();
   }
這樣最基本的一個windows service就搞定了,但是能否正常運行,我們需要調試一把。

二、調試windows service

通常,我們用的調試方法是需要把服務部署好,然後attach to process...,找到對應的服務進程,予以調試。但是操作比較繁瑣,修改完服務後,需要卸載服務,然後重新部署,並且OnStart方法難以調試。 從網絡上找到一個好的調試方法,並嘗試通過,很好用的,推薦給大家:)

1. 在Service1.cs中添加public方法,將需要調試的protected方法進行封裝,供Main()調用,以調試OnStart()爲例:

  public void start(string[] args)
  {
            this.OnStart(args);
  }

2. 在Main()中添加下面的代碼,在人機交互時執行:

     if (Environment.UserInteractive )
            {
                Service1 s = new Service1();
                string[] args = { "a", "b" };
                s.start(args);
                Console.WriteLine("the service is started");
                Console.ReadLine();
                s.stop();
                Console.WriteLine("the service is stopped");
            }
            else
            {
                ServiceBase[] ServicesToRun;
                ServicesToRun = new ServiceBase[] 
         { 
          new Service1() 
         };
                ServiceBase.Run(ServicesToRun);
            }

3. 更改Project的輸出類型

右擊該Project,點擊Properties,在Application標籤中,更改Output Type爲Console Application。

好了,這樣就可以按F5調試了:)

三、部署

1. 在Service1.cs的design視圖中,右擊鼠標,點擊Add Installer,會自動創建一個ProjectInstall.cs文件,在design視圖中,有兩個組件 serviceProcessInstaller1:這個組件的屬性有一個叫Accout,默認是User,這樣在部署的時候需要輸入用戶名和密碼,這裏 我們可以選擇權限最小的Localservice,當然要獲得更多的權限可以設置其它兩個network service和local

serviceInstaller1:與服務本身相關的信息,比如服務名,服務描述,顯示名稱,啓動類型等。

2. 如果使用系統默認的event log,那麼現在就可以編譯然後部署了;如果使用了自定義的event log,則需要在ProjectInstaller中修改部分代碼。

3. 使用installutil.exe部署windows service

(注意權限,這裏需要用Administrator用戶去部署,否則會提示一些錯誤信息 :比如An exception occurred during the Install phase.
System.Security.SecurityException: The source was not found, but some or all eve
nt logs could not be searched.  Inaccessible logs: Security. 或者 access is denied)

runas /user:Administrator cmd

cd C:/Windows/Microsoft.NET/Framework/v2.0.50727

installutil D:/project/WindowsService1/WindowsService1/bin/Debug/windowsservice1.exe

到此就部署完成了。

四、卸載服務

installutil /u D:/project/WindowsService1/WindowsService1/bin/Debug/windowsservice1.exe

五、啓動服務

1. 在啓動服務時,有時候會出現服務啓動後又停止的錯誤提示信息,指出該服務可能沒有被使用 ,我們可以查看eventvwr,裏面會給出足夠的錯誤信息,根據錯誤信息調整service代碼就可以了,也有可能是因爲服務要操作文件,沒有權限的原因,這時候把要操作的文件權限放開就可以了。

2. 啓動服務的時候,由於權限問題啓動失敗,我們可以設置啓動的賬號。

3. windows service的參數是在啓動時一次傳遞的,可以以界面形式傳入參數,也可以通過命令行的形式:sc start service1 arg0 arg1 ...

 

參考鏈接:

http://nuigroup.com/forums/viewthread/9829/

http://stackoverflow.com/questions/593454/easiest-language-to-create-a-windows-service/593803#593803

http://topic.csdn.net/u/20090313/13/7c32b0e3-6e13-4226-8da4-392e31514454.html

http://www.cnblogs.com/guoyinghai/archive/2008/04/16/1156943.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章