C# 開發windows服務的一些心得

來源:互聯網
上載者:User

標籤:des   style   blog   http   color   io   os   使用   ar   

最近在做一個windows服務的項目,發現並解決了一些問題,拿出來和大家分享一下,以下windows服務簡稱“服務”

1.服務如何在某種情況下彈出一個表單?

第一種解決辦法,用安裝程式的代碼修改註冊表來完成:

1.右擊服務的視圖設計介面的空白處,添加安裝程式

2.右擊預設的serviceProcessInstaller1-->屬性-->Account屬性設定為LocalSystem

3.右擊安裝程式空白處-->查看代碼,添加以下代碼

public override void Install(IDictionary stateServer)        {            Microsoft.Win32.RegistryKey system, currentControlSet,services,    service, config;            try            {                            base.Install(stateServer);                //開啟註冊表值                system = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("System");                currentControlSet = system.OpenSubKey("CurrentControlSet");                services = currentControlSet.OpenSubKey("Services");                service = services.OpenSubKey(this.serviceInstaller1.ServiceName, true);                //設定服務的描述                service.SetValue("Description", "這是一個服務");                //允許服務與案頭互動                int value = (int)service.GetValue("Type");                service.SetValue("Type", value | 256);                config = service.CreateSubKey("Parameters");            }            catch (Exception e)            {                Console.WriteLine("An exception was thrown during service installation:/n" + e.ToString());            }        }        public override void Uninstall(IDictionary stateServer)        {            Microsoft.Win32.RegistryKey system,             currentControlSet,             services,             service;            try            {                //Drill down to the service key and open it with write permission                system = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("System");                currentControlSet = system.OpenSubKey("CurrentControlSet");                services = currentControlSet.OpenSubKey("Services");                service = services.OpenSubKey(this.serviceInstaller1.ServiceName, true);                //Delete any keys you created during installation (or that your service created)                service.DeleteSubKeyTree("Parameters");                //...            }            catch (Exception e)            {                Console.WriteLine("Exception encountered while uninstalling service:/n" + e.ToString());            }            finally            {                //Let the project installer do its job                base.Uninstall(stateServer);            }        }

 這個方法很多,也可以在網上搜到

第二種解決辦法,用bat批次檔修改註冊表完成(如果已經啟動並執行服務不是LocalSystem賬戶,是不允許與案頭互動的)

建立一個bat檔案,寫入以下代碼,儲存並雙擊運行,點擊 y 斷行符號更改服務賬戶

reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\自己服務的名稱/v ObjectName /t REG_SZ /d LocalSystem

如果想直接修改註冊表,在以上代碼前加"echo y|"   (沒有雙引號) 這樣雙擊啟動並執行時候就可以直接修改了

 

第三種解決辦法也是最簡單的辦法,通過手動修改

開啟服務控制器,右擊要修改賬戶的服務屬性,登入選項卡,修改為本地系統賬戶,並允許與案頭互動

 

2.服務如何擷取程式當前的路徑?

服務中使用Environment.CurrentDirectory擷取的是system32的路徑

解決辦法:添加引用:window.form

使用Application.StartupPath(擷取到程式產生的檔案夾)

(其它方法暫時還沒有嘗試,所以先不寫了)

3.如何使用Timer?

和form不同,服務有專門的Timer

右擊工具箱"選擇項",.netFrameWork組件:找到Timer

別搞成Form裡的Timer

 4服務的更新

服務有時候出了問題也會用到更新,安裝服務機子少時候可以自己手動更新,多的話,像上百台或更多,在做需求的時候就要想到更新程式是如此的重要

我就是在這方面吃了大虧,請朋友們引以為戒

如兩個服務A和B,B是某某服務,A是B的更新服務,想要實現的功能:系統啟動時自動啟動A服務來檢測B服務是否有更新檔案,有則下載更新,啟動B服務,無則直接啟動B服務

1.兩個服務一定要分開兩個項目來寫,如果在一個項目裡寫兩個服務,在更新的時候就會提示程式正在訪問無法運行而更新失敗

2.B服務要設定為手動啟動,如果早與A服務自動啟動。並且A服務檢測到有更新檔案,將無法完成B服務的更新

3.B服務設定為手動啟動,並不是讓你手動去啟動B服務。是通過A來啟動B。

啟動方式如下:

條件:B服務為LocalSystem,並且B服務已經安裝完成

利用進程啟動B服務

public void RunService()        {            Process PortProcess = new Process();            PortProcess.StartInfo.FileName = "cmd.exe";            PortProcess.StartInfo.UseShellExecute = false;            PortProcess.StartInfo.RedirectStandardInput = true;            PortProcess.StartInfo.RedirectStandardOutput = true;            PortProcess.StartInfo.RedirectStandardError = true;            PortProcess.StartInfo.CreateNoWindow = true;            try            {                PortProcess.Start();                PortProcess.StandardInput.WriteLine("net start 服務的名稱");                PortProcess.StandardInput.WriteLine("exit");                PortProcess.Close();            }            catch (Exception)            {            }        }

其它方式有待改進,暫不貼出

多說都是淚,方法和思路都是自己試出來的,有什麼代碼或思路錯誤請朋友們提出,對的點個贊,謝謝~

 

C# 開發windows服務的一些心得

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.