標籤: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服務的一些心得