使用C#开发自己的定义windows服务是一个很简单的事。因此,当。我们需要发展自己windows它的服务。这是当我们需要有定期的计算机或运行某些程序的时候,我们开发。在这里,我有WCF监听案例,因为我是做本地聊天室。必须server结束监控终端,所以,我开发了一个服务。便控制此监听服务。

然而。我们开发的windows服务,默认情况下是无法可视化的操作的。这里我就额外的开发一个工具来对此服务进行操作,效果图例如以下:

开发步骤:

1、“新建项目”——“Window服务”



Program.cs代码:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.ServiceModel;
  6. using System.ServiceModel.Description;
  7. using System.ServiceProcess;
  8.  
  9. namespace MSMQChatService
  10. {
  11. class Program
  12. {
  13. static void Main()
  14. {
  15. #region 服务启动入口。正式用
  16.  
  17. ServiceBase[] ServicesToRun;
  18. ServicesToRun = new ServiceBase[] { new MQChatService() };
  19. ServiceBase.Run(ServicesToRun);
  20.  
  21. #endregion
  22. }
  23. }

MQChatService.cs代码例如以下:

  1. protected override void OnStart(string[] args)
  2. {
  3. //开启服务 这里就是你想要让服务做的操作
  4. StartService();
  5. }

3、切换到MQChatService的可视化界面

4、在可视化界面,单击鼠标右键,

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvem91eXVqaWUxMTI3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

将会出现一个Installer为后缀的新界面。默认好像是Project Installer.cs,我这里将其重命名为ServiceInstaller.cs

分别对界面上这两个组件进行属性配置,详细的属性签名能够查看属性面板的最以下(右下角处)

好了,我们的windows服务已经开发好了。接下来就开发一个可视化的控制器,来控制服务的安装、卸载、启动和停止。

1、  新建一个windows程序,名称ServiceSetup。Form1重命名为FrmServiceSetup,

界面控件例如以下:

Program.cs代码例如以下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.Linq;
  5. using System.Threading;
  6. using System.Threading.Tasks;
  7. using System.Windows.Forms;
  8.  
  9. namespace ServiceSetup
  10. {
  11. static class Program
  12. {
  13. /// <summary>
  14. /// 应用程序的主入口点。
  15. /// </summary>
  16. [STAThread]
  17. static void Main()
  18. {
  19.   //获取欲启动进程名
  20.             string strProcessName = System.Diagnostics.Process.GetCurrentProcess().ProcessName;
  21.             ////获取版本
  22.             //CommonData.VersionNumber = Application.ProductVersion;
  23.             //检查进程是否已经启动,已经启动则显示报错信息退出程序。
  24.  
  25.             if (System.Diagnostics.Process.GetProcessesByName(strProcessName).Length > 1)
  26.             {
  27.                 MessageBox.Show("程序已经执行。");
  28.                 Thread.Sleep(1000);
  29.                 System.Environment.Exit(1);
  30.             }
  31.             else
  32.             {
  33.                 Application.EnableVisualStyles();
  34.                 Application.SetCompatibleTextRenderingDefault(false);
  35.                 Application.Run(new FrmServiceSetup());
  36.             }
  37. }
  38. }
  39. }

主界面代码:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10.  
  11. namespace ServiceSetup
  12. {
  13. public partial class FrmServiceSetup : Form
  14. {
  15. string strServiceName = string.Empty;
  16. public FrmServiceSetup()
  17. {
  18. InitializeComponent();
  19. strServiceName = string.IsNullOrEmpty(lblServiceName.Text) ? "MSMQChatService" : lblServiceName.Text;
  20. InitControlStatus(strServiceName, btnInstallOrUninstall, btnStartOrEnd, btnGetStatus, lblMsg, gbMain);
  21. }
  22.  
  23. /// <summary>
  24. /// 初始化控件状态
  25. /// </summary>
  26. /// <param name="serviceName">服务名称</param>
  27. /// <param name="btn1">安装button</param>
  28. /// <param name="btn2">启动button</param>
  29. /// <param name="btn3">获取状态button</param>
  30. /// <param name="txt">提示信息</param>
  31. /// <param name="gb">服务所在组合框</param>
  32. void InitControlStatus(string serviceName, Button btn1, Button btn2, Button btn3, Label txt, GroupBox gb)
  33. {
  34. try
  35. {
  36. btn1.Enabled = true;
  37.  
  38. if (ServiceAPI.isServiceIsExisted(serviceName))
  39. {
  40. btn3.Enabled = true;
  41. btn2.Enabled = true;
  42. btn1.Text = "卸载服务";
  43. int status = ServiceAPI.GetServiceStatus(serviceName);
  44. if (status == 4)
  45. {
  46. btn2.Text = "停止服务";
  47. }
  48. else
  49. {
  50. btn2.Text = "启动服务";
  51. }
  52. GetServiceStatus(serviceName, txt);
  53. //获取服务版本号
  54. string temp = string.IsNullOrEmpty(ServiceAPI.GetServiceVersion(serviceName)) ? string.Empty : "(" + ServiceAPI.GetServiceVersion(serviceName) + ")";
  55. gb.Text += temp;
  56. }
  57. else
  58. {
  59. btn1.Text = "安装服务";
  60. btn2.Enabled = false;
  61. btn3.Enabled = false;
  62. txt.Text = "服务【" + serviceName + "】未安装!";
  63. }
  64. }
  65. catch (Exception ex)
  66. {
  67. txt.Text = "error";
  68. LogAPI.WriteLog(ex.Message);
  69. }
  70. }
  71.  
  72. /// <summary>
  73. /// 安装或卸载服务
  74. /// </summary>
  75. /// <param name="serviceName">服务名称</param>
  76. /// <param name="btnSet">安装、卸载</param>
  77. /// <param name="btnOn">启动、停止</param>
  78. /// <param name="txtMsg">提示信息</param>
  79. /// <param name="gb">组合框</param>
  80. void SetServerce(string serviceName, Button btnSet, Button btnOn, Button btnShow, Label txtMsg, GroupBox gb)
  81. {
  82. try
  83. {
  84. string location = System.Reflection.Assembly.GetExecutingAssembly().Location;
  85. string serviceFileName = location.Substring(0, location.LastIndexOf('\\')) + "\\" + serviceName + ".exe";
  86.  
  87. if (btnSet.Text == "安装服务")
  88. {
  89. ServiceAPI.InstallmyService(null, serviceFileName);
  90. if (ServiceAPI.isServiceIsExisted(serviceName))
  91. {
  92. txtMsg.Text = "服务【" + serviceName + "】成功安装!";
  93. btnOn.Enabled = btnShow.Enabled = true;
  94. string temp = string.IsNullOrEmpty(ServiceAPI.GetServiceVersion(serviceName)) ?
  95.  
  96. string.Empty : "(" + ServiceAPI.GetServiceVersion(serviceName) + ")";
  97. gb.Text += temp;
  98. btnSet.Text = "卸载服务";
  99. btnOn.Text = "启动服务";
  100. }
  101. else
  102. {
  103. txtMsg.Text = "服务【" + serviceName + "】安装失败,请检查日志。";
  104. }
  105. }
  106. else
  107. {
  108. ServiceAPI.UnInstallmyService(serviceFileName);
  109. if (!ServiceAPI.isServiceIsExisted(serviceName))
  110. {
  111. txtMsg.Text = "服务【" + serviceName + "】卸载成功!";
  112. btnOn.Enabled = btnShow.Enabled = false;
  113. btnSet.Text = "安装服务";
  114. //gb.Text =strServiceName;
  115. }
  116. else
  117. {
  118. txtMsg.Text = "服务【" + serviceName + "】卸载失败。请检查日志!";
  119. }
  120. }
  121. }
  122. catch (Exception ex)
  123. {
  124. txtMsg.Text = "error";
  125. LogAPI.WriteLog(ex.Message);
  126. }
  127. }
  128.  
  129. //获取服务状态
  130. void GetServiceStatus(string serviceName, Label txtStatus)
  131. {
  132. try
  133. {
  134. if (ServiceAPI.isServiceIsExisted(serviceName))
  135. {
  136. string statusStr = "";
  137. int status = ServiceAPI.GetServiceStatus(serviceName);
  138. switch (status)
  139. {
  140. case 1:
  141. statusStr = "服务未执行!
  142.  
  143. ";
  144. break;
  145. case 2:
  146. statusStr = "服务正在启动!";
  147. break;
  148. case 3:
  149. statusStr = "服务正在停止!
  150.  
  151. ";
  152. break;
  153. case 4:
  154. statusStr = "服务正在执行。";
  155. break;
  156. case 5:
  157. statusStr = "服务即将继续。";
  158. break;
  159. case 6:
  160. statusStr = "服务即将暂停!";
  161. break;
  162. case 7:
  163. statusStr = "服务已暂停!
  164.  
  165. ";
  166. break;
  167. default:
  168. statusStr = "未知状态!";
  169. break;
  170. }
  171. txtStatus.Text = statusStr;
  172. }
  173. else
  174. {
  175. txtStatus.Text = "服务【" + serviceName + "】未安装!";
  176. }
  177. }
  178. catch (Exception ex)
  179. {
  180. txtStatus.Text = "error";
  181. LogAPI.WriteLog(ex.Message);
  182. }
  183. }
  184.  
  185. //启动服务
  186. void OnService(string serviceName, Button btn, Label txt)
  187. {
  188. try
  189. {
  190. if (btn.Text == "启动服务")
  191. {
  192. ServiceAPI.RunService(serviceName);
  193.  
  194. int status = ServiceAPI.GetServiceStatus(serviceName);
  195. if (status == 2 || status == 4 || status == 5)
  196. {
  197. txt.Text = "服务【" + serviceName + "】启动成功!";
  198. btn.Text = "停止服务";
  199. }
  200. else
  201. {
  202. txt.Text = "服务【" + serviceName + "】启动失败!";
  203. }
  204. }
  205. else
  206. {
  207. ServiceAPI.StopService(serviceName);
  208.  
  209. int status = ServiceAPI.GetServiceStatus(serviceName);
  210. if (status == 1 || status == 3 || status == 6 || status == 7)
  211. {
  212. txt.Text = "服务【" + serviceName + "】停止成功!";
  213. btn.Text = "启动服务";
  214. }
  215. else
  216. {
  217. txt.Text = "服务【" + serviceName + "】停止失败。";
  218. }
  219. }
  220. }
  221. catch (Exception ex)
  222. {
  223. txt.Text = "error";
  224. LogAPI.WriteLog(ex.Message);
  225. }
  226. }
  227.  
  228. //安装or卸载服务
  229. private void btnInstallOrUninstall_Click(object sender, EventArgs e)
  230. {
  231. btnInstallOrUninstall.Enabled = false;
  232. SetServerce(strServiceName, btnInstallOrUninstall, btnStartOrEnd, btnGetStatus, lblMsg, gbMain);
  233. btnInstallOrUninstall.Enabled = true;
  234. btnInstallOrUninstall.Focus();
  235. }
  236.  
  237. //启动or停止服务
  238. private void btnStartOrEnd_Click(object sender, EventArgs e)
  239. {
  240. btnStartOrEnd.Enabled = false;
  241. OnService(strServiceName, btnStartOrEnd, lblMsg);
  242. btnStartOrEnd.Enabled = true;
  243. btnStartOrEnd.Focus();
  244. }
  245.  
  246. //获取服务状态
  247. private void btnGetStatus_Click(object sender, EventArgs e)
  248. {
  249. btnGetStatus.Enabled = false;
  250. GetServiceStatus(strServiceName, lblMsg);
  251. btnGetStatus.Enabled = true;
  252. btnGetStatus.Focus();
  253. }
  254.  
  255. private void FrmServiceSetup_Resize(object sender, EventArgs e)
  256. {
  257. if (this.WindowState == FormWindowState.Minimized) //最小化到系统托盘
  258. {
  259. notifyIcon1.Visible = true; //显示托盘图标
  260. this.ShowInTaskbar = false;
  261. this.Hide(); //隐藏窗口
  262. }
  263. }
  264.  
  265. private void FrmServiceSetup_FormClosing(object sender, FormClosingEventArgs e)
  266. {
  267. DialogResult result = MessageBox.Show("是缩小到托盘?", "确认", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Information);
  268. if (result== DialogResult.Yes)
  269. {
  270. // 取消关闭窗口
  271. e.Cancel = true;
  272. // 将窗口变为最小化
  273. this.WindowState = FormWindowState.Minimized;
  274. }
  275. else if (result == DialogResult.No)
  276. {
  277. System.Environment.Exit(0);
  278. }
  279. else
  280. {
  281. e.Cancel = true;
  282. }
  283. }
  284.  
  285. private void notifyIcon1_MouseClick(object sender, MouseEventArgs e)
  286. {
  287. if (e.Button == MouseButtons.Left&&this.WindowState == FormWindowState.Minimized)
  288. {
  289. this.Show();
  290. this.WindowState = FormWindowState.Normal;
  291. this.ShowInTaskbar = true; //显示在系统任务栏
  292. //notifyIcon1.Visible = false; //托盘图标不可见
  293. this.Activate();
  294. }
  295. }
  296.  
  297. private void 打开主界面ToolStripMenuItem_Click(object sender, EventArgs e)
  298. {
  299. this.Show();
  300. this.WindowState = FormWindowState.Normal;
  301. this.ShowInTaskbar = true; //显示在系统任务栏
  302. notifyIcon1.Visible = false; //托盘图标不可见
  303. this.Activate();
  304. }
  305.  
  306. private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
  307. {
  308. System.Environment.Exit(0);
  309. ExitProcess();
  310. }
  311.     //结束进程
  312.         private void ExitProcess()
  313.         {
  314.             System.Environment.Exit(0);
  315.             Process[] ps = Process.GetProcesses();
  316.             foreach (Process item in ps)
  317.             {
  318.                 if (item.ProcessName == "ServiceSetup")
  319.                 {
  320.                     item.Kill();
  321.                 }
  322.             }
  323.         }
  324.  }
  325. }

新建一个类,专门用于日志操作LogAPI.cs

  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7.  
  8. namespace ServiceSetup
  9. {
  10. public class LogAPI
  11. {
  12. private static string myPath = "";
  13. private static string myName = "";
  14.  
  15. /// <summary>
  16. /// 初始化日志文件
  17. /// </summary>
  18. /// <param name="logPath"></param>
  19. /// <param name="logName"></param>
  20. public static void InitLogAPI(string logPath, string logName)
  21. {
  22. myPath = logPath;
  23. myName = logName;
  24. }
  25.  
  26. /// <summary>
  27. /// 写入日志
  28. /// </summary>
  29. /// <param name="ex">日志信息</param>
  30. public static void WriteLog(string ex)
  31. {
  32. if (myPath == "" || myName == "")
  33. return;
  34.  
  35. string Year = DateTime.Now.Year.ToString();
  36. string Month = DateTime.Now.Month.ToString().PadLeft(2, '0');
  37. string Day = DateTime.Now.Day.ToString().PadLeft(2, '0');
  38.  
  39. //年月日文件夹是否存在,不存在则建立
  40. if (!Directory.Exists(myPath + "\\LogFiles\\" + Year + "_" + Month + "\\" + Year + "_" + Month + "_" + Day))
  41. {
  42. Directory.CreateDirectory(myPath + "\\LogFiles\\" + Year + "_" + Month + "\\" + Year + "_" + Month + "_" + Day);
  43. }
  44.  
  45. //写入日志UNDO,Exception has not been handle
  46. string LogFile = myPath + "\\LogFiles\\" + Year + "_" + Month + "\\" + Year + "_" + Month + "_" + Day + "\\" + myName;
  47. if (!File.Exists(LogFile))
  48. {
  49. System.IO.StreamWriter myFile;
  50. myFile = System.IO.File.AppendText(LogFile);
  51. myFile.Close();
  52. }
  53.  
  54. while (true)
  55. {
  56. try
  57. {
  58. StreamWriter sr = File.AppendText(LogFile);
  59. sr.WriteLine(DateTime.Now.ToString("HH:mm:ss") + " " + ex);
  60. sr.Close();
  61. break;
  62. }
  63. catch (Exception e)
  64. {
  65. System.Threading.Thread.Sleep(50);
  66. continue;
  67. }
  68. }
  69.  
  70. }
  71.  
  72. }
  73. }

Windows服务的操作类ServiceAPI.cs

  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Configuration.Install;
  5. using System.IO;
  6. using System.Linq;
  7. using System.Reflection;
  8. using System.ServiceProcess;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. using Microsoft.Win32;
  12.  
  13. namespace ServiceSetup
  14. {
  15. public class ServiceAPI
  16. {
  17. /// <summary>
  18. /// 检查服务存在的存在性
  19. /// </summary>
  20. /// <param name=" NameService ">服务名</param>
  21. /// <returns>存在返回 true,否则返回 false;</returns>
  22. public static bool isServiceIsExisted(string NameService)
  23. {
  24. ServiceController[] services = ServiceController.GetServices();
  25. foreach (ServiceController s in services)
  26. {
  27. if (s.ServiceName.ToLower() == NameService.ToLower())
  28. {
  29. return true;
  30. }
  31. }
  32. return false;
  33. }
  34. /// <summary>
  35. /// 安装Windows服务
  36. /// </summary>
  37. /// <param name="stateSaver">集合</param>
  38. /// <param name="filepath">程序文件路径</param>
  39. public static void InstallmyService(IDictionary stateSaver, string filepath)
  40. {
  41. AssemblyInstaller AssemblyInstaller1 = new AssemblyInstaller();
  42. AssemblyInstaller1.UseNewContext = true;
  43. AssemblyInstaller1.Path = filepath;
  44. AssemblyInstaller1.Install(stateSaver);
  45. AssemblyInstaller1.Commit(stateSaver);
  46. AssemblyInstaller1.Dispose();
  47. }
  48. /// <summary>
  49. /// 卸载Windows服务
  50. /// </summary>
  51. /// <param name="filepath">程序文件路径</param>
  52. public static void UnInstallmyService(string filepath)
  53. {
  54. AssemblyInstaller AssemblyInstaller1 = new AssemblyInstaller();
  55. AssemblyInstaller1.UseNewContext = true;
  56. AssemblyInstaller1.Path = filepath;
  57. AssemblyInstaller1.Uninstall(null);
  58. AssemblyInstaller1.Dispose();
  59. }
  60.  
  61. /// <summary>
  62. /// 启动服务
  63. /// </summary>
  64. /// <param name=" NameService ">服务名</param>
  65. /// <returns>存在返回 true,否则返回 false;</returns>
  66. public static bool RunService(string NameService)
  67. {
  68. bool bo = true;
  69. try
  70. {
  71. ServiceController sc = new ServiceController(NameService);
  72. if (sc.Status.Equals(ServiceControllerStatus.Stopped) || sc.Status.Equals(ServiceControllerStatus.StopPending))
  73. {
  74. sc.Start();
  75. }
  76. }
  77. catch (Exception ex)
  78. {
  79. bo = false;
  80. LogAPI.WriteLog(ex.Message);
  81. }
  82.  
  83. return bo;
  84. }
  85.  
  86. /// <summary>
  87. /// 停止服务
  88. /// </summary>
  89. /// <param name=" NameService ">服务名</param>
  90. /// <returns>存在返回 true,否则返回 false;</returns>
  91. public static bool StopService(string NameService)
  92. {
  93. bool bo = true;
  94. try
  95. {
  96. ServiceController sc = new ServiceController(NameService);
  97. if (!sc.Status.Equals(ServiceControllerStatus.Stopped))
  98. {
  99. sc.Stop();
  100. }
  101. }
  102. catch (Exception ex)
  103. {
  104. bo = false;
  105. LogAPI.WriteLog(ex.Message);
  106. }
  107.  
  108. return bo;
  109. }
  110.  
  111. /// <summary>
  112. /// 获取服务状态
  113. /// </summary>
  114. /// <param name=" NameService ">服务名</param>
  115. /// <returns>返回服务状态</returns>
  116. public static int GetServiceStatus(string NameService)
  117. {
  118. int ret = 0;
  119. try
  120. {
  121. ServiceController sc = new ServiceController(NameService);
  122. ret = Convert.ToInt16(sc.Status);
  123. }
  124. catch (Exception ex)
  125. {
  126. ret = 0;
  127. LogAPI.WriteLog(ex.Message);
  128. }
  129.  
  130. return ret;
  131. }
  132.  
  133. /// <summary>
  134. /// 获取服务安装路径
  135. /// </summary>
  136. /// <param name="ServiceName"></param>
  137. /// <returns></returns>
  138. public static string GetWindowsServiceInstallPath(string ServiceName)
  139. {
  140. string path = "";
  141. try
  142. {
  143. string key = @"SYSTEM\CurrentControlSet\Services\" + ServiceName;
  144. path = Registry.LocalMachine.OpenSubKey(key).GetValue("ImagePath").ToString();
  145.  
  146. path = path.Replace("\"", string.Empty);//替换掉双引號
  147.  
  148. FileInfo fi = new FileInfo(path);
  149. path = fi.Directory.ToString();
  150. }
  151. catch (Exception ex)
  152. {
  153. path = "";
  154. LogAPI.WriteLog(ex.Message);
  155. }
  156. return path;
  157. }
  158.  
  159. /// <summary>
  160. /// 获取指定服务的版本
  161. /// </summary>
  162. /// <param name="serviceName">服务名称</param>
  163. /// <returns></returns>
  164. public static string GetServiceVersion(string serviceName)
  165. {
  166. if (string.IsNullOrEmpty(serviceName))
  167. {
  168. return string.Empty;
  169. }
  170. try
  171. {
  172. string path = GetWindowsServiceInstallPath(serviceName) + "\\" + serviceName + ".exe";
  173. Assembly assembly = Assembly.LoadFile(path);
  174. AssemblyName assemblyName = assembly.GetName();
  175. Version version = assemblyName.Version;
  176. return version.ToString();
  177. }
  178. catch (Exception ex)
  179. {
  180. LogAPI.WriteLog(ex.Message);
  181. return string.Empty;
  182. }
  183. }
  184. }
  185. }

注意:记住服务程序dll复制到可视化的安装程序bin下面的文件夹。

版权声明:本文博客原创文章,博客,未经同意,不得转载。

C#开发人员能够可视化操作windows服务的更多相关文章

  1. C# 操作windows服务[启动、停止、卸载、安装]

    主要宗旨:不已命令形式操作windows服务 static void Main(string[] args) { var path = @"E:\开发辅助项目\WCF\WCF.Test\WC ...

  2. C#通过SC命令和静态公共类来操作Windows服务

    调用的Windows服务应用程序网址:http://www.cnblogs.com/pingming/p/5115304.html 一.引用 二.公共静态类:可以单独放到类库里 using Syste ...

  3. cmd命令行和bat批处理操作windows服务(转载)

    一.cmd命令行---进行Windows服务操作 1.安装服务 sc create 服务名 binPath= "C:\Users\Administrator\Desktop\win32srv ...

  4. C#.NET 操作Windows服务承载WCF

    Windows服务的制作.安装可以参考这篇: C#.NET 操作Windows服务(安装.卸载) - runliuv - 博客园 (cnblogs.com) 本篇会在这个解决方案基础上,继续修改. 一 ...

  5. 开发便于运维的Windows服务

    过去几个月,DevOps on Windows网站推出了一系列文章,详细讲解了开发者应怎样创建便于运维的Windows服务.这一系列文章详细分析了如何克服在运维部门看来最困难的部分:Windows服务 ...

  6. SC命令---安装、开启、配置、关闭 cmd命令行和bat批处理操作windows服务

      一.cmd命令行---进行Windows服务操作 1.安装服务 sc create 服务名 binPath= "C:\Users\Administrator\Desktop\win32s ...

  7. C#.NET 操作Windows服务(安装、卸载)

    注意点: 1.安装时要请求到管理员权限. 2.卸载前,一定要停止掉Windows服务,否则需要重启或注销电脑.代码无法停止服务时,使用services.msc来停止. 开始: 1.新建一个名为&quo ...

  8. C#操作windows服务

    本文主要说明了Windows服务的安装.卸载.启动.停止.获取服务安装路径.获取服务状态.检查服务是否存在.获取服务版本. 我们需要引用命名空间using System.Configuration.I ...

  9. C#操作windows服务,安装、卸载、停止、启动

    public class ServiceUtil { private string _ServiceName = string.Empty; private string _AppName = str ...

随机推荐

  1. cocos2d-x3.0数据结构

    1.cocos2d::Vector 1.头报价"CCVector.h"头文件. 2.保存的数据类型必须是cocos2d::Ref的子类. 3.实现是动态加入数据集合即链表.主要的使 ...

  2. SharePoint使用BCS开发你第一个应用程序(一)

    SharePoint使用BCS开发你第一个应用程序(一)         本系列教你使用BCS(Business Connectivity Service)创建OBA(Office business ...

  3. C. Captain Marmot (Codeforces Round #271)

    C. Captain Marmot time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  4. SPOJ TWOPATHS Two Paths

    题目意思:给一棵树,找到俩个不相交的通路,使得这俩个通路的长度和乘机最大: 解法: 小哥一看呵呵 这不就是枚举点 然后求俩边的树的直径在相乘求个最大值的题么! 呵呵 这个N 有100000 当时就不玩 ...

  5. HDU-2857-Mirror and Light(计算几何)

    Problem Description The light travels in a straight line and always goes in the minimal path between ...

  6. webclient下载文件 带进度条

    private void button1_Click(object sender, EventArgs e) { doDownload(textBox1.Text.Trim()); } private ...

  7. 深入研究Java类载入机制

    深入研究Java类载入机制   类载入是Java程序运行的第一步,研究类的载入有助于了解JVM运行过程,并指导开发人员採取更有效的措施配合程序运行. 研究类载入机制的第二个目的是让程序能动态的控制类载 ...

  8. 如何设置ubuntu自己主动的睡眠时间

    我相信很多在学习linux的过程中.总会遇到,不时系统会冬眠自己主动,因此,即使再次输入password.么重要的内容怕别人看 另外假设你常常使用像Putty这样子的远程登录软件的话,假设你的linu ...

  9. IOC/DI的基本思想

    IOC/DI的基本思想 1.把程序之间的依赖关系去掉 2.把程序对象设置到IOC/DI容器的配置中作为Bean 3.由IOC/D.容器来管理Bean的创建和实例化 4.由IOC/DI容器来把Bean之 ...

  10. MEF初体验之十一:查询组合容器

    查询组合容器 组合容器暴露了几个get exports的重载方法和导出对象和对象集合.你需要注意下面的行为: 当请求单个对象实例时,如果未发现导出,一个异常将被抛出 当请求单个对象实例时,如果发现超过 ...