在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
关于WIndows服务的介绍,之前写过一篇: http://blog.csdn.net/yysyangyangyangshan/article/details/7295739。可能这里对如何写一个服务不是很详细。现在纯用代码的形式介绍一下windows服务是如何开发和安装的。 public partial class Service1 : ServiceBase { System.Threading.Timer recordTimer; public Service1() { InitializeComponent(); } protected override void OnStart(string[] args) { } protected override void OnStop() { } } 只要在OnStart里完成你的功能代码即可。本例中我们做一个定时向本地文件写记录的功能。 public class FileOpetation { /// <summary> /// 保存至本地文件 /// </summary> /// <param name="ETMID"></param> /// <param name="content"></param> public static void SaveRecord(string content) { if (string.IsNullOrEmpty(content)) { return; } FileStream fileStream = null; StreamWriter streamWriter = null; try { string path = Path.Combine(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase, string.Format("{0:yyyyMMdd}", DateTime.Now)); using (fileStream = new FileStream(path, FileMode.Append, FileAccess.Write)) { using (streamWriter = new StreamWriter(fileStream)) { streamWriter.Write(content); if (streamWriter != null) { streamWriter.Close(); } } if (fileStream != null) { fileStream.Close(); } } } catch { } } } 那么在Service1中调用, public partial class Service1 : ServiceBase { System.Threading.Timer recordTimer; public Service1() { InitializeComponent(); } protected override void OnStart(string[] args) { IntialSaveRecord(); } protected override void OnStop() { if (recordTimer != null) { recordTimer.Dispose(); } } private void IntialSaveRecord() { TimerCallback timerCallback = new TimerCallback(CallbackTask); AutoResetEvent autoEvent = new AutoResetEvent(false); recordTimer = new System.Threading.Timer(timerCallback, autoEvent, 10000, 60000 * 10); } private void CallbackTask(Object stateInfo) { FileOpetation.SaveRecord(string.Format(@"当前记录时间:{0},状况:程序运行正常!", DateTime.Now)); } } 这样服务算是写的差不多了,下面添加一个安装类,用于安装。 安装代码,
class Program { static void Main(string[] args) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); string sysDisk = System.Environment.SystemDirectory.Substring(0,3); string dotNetPath = sysDisk + @"WINDOWS\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe";//因为当前用的是4.0的环境 string serviceEXEPath = Application.StartupPath+@"\MyFirstWindowsService.exe";//把服务的exe程序拷贝到了当前运行目录下,所以用此路径 string serviceInstallCommand = string.Format(@"{0} {1}", dotNetPath, serviceEXEPath);//安装服务时使用的dos命令 string serviceUninstallCommand = string.Format(@"{0} -U {1}", dotNetPath, serviceEXEPath);//卸载服务时使用的dos命令 try { if (File.Exists(dotNetPath)) { string[] cmd = new string[] { serviceUninstallCommand }; string ss = Cmd(cmd); CloseProcess("cmd.exe"); } } catch { } Thread.Sleep(1000); try { if (File.Exists(dotNetPath)) { string[] cmd = new string[] { serviceInstallCommand }; string ss = Cmd(cmd); CloseProcess("cmd.exe"); } } catch { } try { Thread.Sleep(3000); ServiceController sc = new ServiceController("MyFirstWindowsService"); if (sc != null && (sc.Status.Equals(ServiceControllerStatus.Stopped)) || (sc.Status.Equals(ServiceControllerStatus.StopPending))) { sc.Start(); } sc.Refresh(); } catch { } } /// <summary> /// 运行CMD命令 /// </summary> /// <param name="cmd">命令</param> /// <returns></returns> public static string Cmd(string[] cmd) { Process p = new Process(); p.StartInfo.FileName = "cmd.exe"; p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardInput = true; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.RedirectStandardError = true; p.StartInfo.CreateNoWindow = true; p.Start(); p.StandardInput.AutoFlush = true; for (int i = 0; i < cmd.Length; i++) { p.StandardInput.WriteLine(cmd[i].ToString()); } p.StandardInput.WriteLine("exit"); string strRst = p.StandardOutput.ReadToEnd(); p.WaitForExit(); p.Close(); return strRst; } /// <summary> /// 关闭进程 /// </summary> /// <param name="ProcName">进程名称</param> /// <returns></returns> public static bool CloseProcess(string ProcName) { bool result = false; System.Collections.ArrayList procList = new System.Collections.ArrayList(); string tempName = ""; int begpos; int endpos; foreach (System.Diagnostics.Process thisProc in System.Diagnostics.Process.GetProcesses()) { tempName = thisProc.ToString(); begpos = tempName.IndexOf("(") + 1; endpos = tempName.IndexOf(")"); tempName = tempName.Substring(begpos, endpos - begpos); procList.Add(tempName); if (tempName == ProcName) { if (!thisProc.CloseMainWindow()) thisProc.Kill(); // 当发送关闭窗口命令无效时强行结束进程 result = true; } } return result; } } 这段代码其实可以放在项目中的某个地方,或单独执行程序中,只好设置好dotNetPath和serviceEXEPath路径就可以了。
运行完后,如图, 这样,一个windows服务安装成功了。 代码下载:http://download.csdn.net/detail/yysyangyangyangshan/6032671
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论