开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 6623|回复: 2
收起左侧

[C#图文教程] 设计一个系统服务带安装程序

[复制链接]
发表于 2018-3-12 04:47:56 | 显示全部楼层 |阅读模式   湖北省武汉市
新建项目,选windows服务 如图
2018-03-11.png
起名WriteLogs,将Service1.cs改名为WriteLogs.cs,编辑该文件 ,先建三个字段。
  1. private Task t;
  2.         private CancellationTokenSource cts;
  3.         private string logs = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "logs.txt");
复制代码
建一个方法InitializeTask ,初始化任务。
  1. private void InitializeTask()
  2.         {
  3.             cts = new CancellationTokenSource();
  4.             cts.Token.Register(() =>
  5.             {
  6.                 if(File.Exists(logs))
  7.                 {
  8.                     using (StreamWriter sw = new StreamWriter(logs, true))
  9.                     {
  10.                         sw.WriteLine(DateTime.Now.ToString("yyyy年MM月dd日 hh:mm:ss 运行结束"));
  11.                     }
  12.                 }
  13.             }
  14.             );
  15.         
  16.             t = new Task(DoWriteLogs, logs);
  17.         }
复制代码
再建一个任务调用的方法,在方法中随便做点什么。
  1. private void DoWriteLogs(object o)
  2.         {
  3.             string logs = o as string;
  4.             CancellationToken token = cts.Token;
  5.             while (true)
  6.             {
  7.                 if (token.IsCancellationRequested)
  8.                 {
  9.                     token.ThrowIfCancellationRequested();
  10.                     break;
  11.                 }

  12.                 if (File.Exists(logs))
  13.                 {
  14.                     using (StreamWriter sw = new StreamWriter(logs, true))
  15.                     {
  16.                         sw.WriteLine(DateTime.Now.ToString("yyyy年MM月dd日 hh:mm:ss 运行中..."));
  17.                     }
  18.                 }
  19.                 else
  20.                 {
  21.                     using (StreamWriter sw = File.CreateText(logs))
  22.                     {
  23.                         sw.WriteLine(DateTime.Now.ToString("yyyy年MM月dd日 hh:mm:ss 运行中..."));
  24.                     }
  25.                 }

  26.                 Task.Delay(3000).Wait();
  27.             }
  28.         }
复制代码
把初始化的方法放入构造函数中
  1. public WriteLogs()
  2.         {
  3.             InitializeComponent();
  4.             InitializeTask();
  5.         }
复制代码
开始任务
  1. protected override void OnStart(string[] args)
  2.         {
  3.             if (t.Status != TaskStatus.Running)
  4.                 t.Start();
  5.         }
复制代码
停止任务
  1. protected override void OnStop()
  2.         {
  3.             cts.Cancel();
  4.         }
复制代码

服务的主体就写好了,在WriteLogs的设计界面,右击添加安装程序,在ProjectInstaller.cs设计界面可以看到添加了二个文件,一个是serviceinstaller1,一个是serviceProcessInstaller1,选中serviceinstaller1,在属性界面,将ServiceName属性改为我们自己的服务名:WriteLogs,将StartType属性改为Automatic。选中ServiceProcessInstaller1,在属性界面将Account改为LocalSystem。至此,服务完成了,可以生成该服务。
第二段,右击解决方案,添加《新建项目》,选wpf应用,起名为LogsManager,将界面设计成下图
2018-03-12.png
引用System.ServiceProcess;System.Configuration.Install 见下图

注意using名称空间,先设计二个字段
  1. private string _servicePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "WriteLogs.exe");
  2.         private string _serviceName = "WriteLogs";
复制代码
然后编写判断服务是否存在的方法
  1. private bool IsServiceExist(string serviceName)
  2.         {
  3.             bool isExist = false;
  4.             foreach(var service in ServiceController.GetServices())
  5.             {
  6.                 if (service.ServiceName == serviceName)
  7.                     isExist = true;
  8.                 else isExist = false;
  9.             }

  10.             return isExist;
  11.         }
复制代码
安装服务方法
  1. private void InstallService(string servicePath)
  2.         {
  3.             using (AssemblyInstaller installer = new AssemblyInstaller())
  4.             {
  5.                 installer.UseNewContext = true;
  6.                 installer.Path = servicePath;
  7.                 using (TransactedInstaller transactedInstaller = new TransactedInstaller())
  8.                 {
  9.                     transactedInstaller.Installers.Add(installer);
  10.                     transactedInstaller.Install(new System.Collections.Hashtable());
  11.                 }
  12.             }
  13.         }
复制代码
卸载服务的方法
  1. private void UninstallService(string servicePath)
  2.         {
  3.             using (AssemblyInstaller installer = new AssemblyInstaller())
  4.             {
  5.                 installer.UseNewContext = true;
  6.                 installer.Path = servicePath;
  7.                 using (TransactedInstaller transactedInstaller = new TransactedInstaller())
  8.                 {
  9.                     transactedInstaller.Installers.Add(installer);
  10.                     transactedInstaller.Uninstall(null);
  11.                 }
  12.             }
  13.         }
复制代码
启动服务的方法
  1. private void StartService(string serviceName)
  2.         {
  3.             using (ServiceController sc = new ServiceController(serviceName))
  4.             {
  5.                 if (sc.Status == ServiceControllerStatus.Stopped)
  6.                     sc.Start();
  7.             }
  8.         }
复制代码
停止服务的方法
  1. private void StopService(string serviceName)
  2.         {
  3.             using (ServiceController sc = new ServiceController(serviceName))
  4.             {
  5.                 if (sc.Status == ServiceControllerStatus.Running)
  6.                     sc.Stop();
  7.             }
  8.         }
复制代码
然后编写各个按钮的click事件
  1. private void Exit_Click(object sender, RoutedEventArgs e)
  2.         {
  3.             Application.Current.Shutdown();
  4.         }

  5.         private void Uninstall_Click(object sender, RoutedEventArgs e)
  6.         {
  7.             if(IsServiceExist(_serviceName))
  8.             {
  9.                 StopService(_serviceName);
  10.                 UninstallService(_servicePath);
  11.                 if(!IsServiceExist(_serviceName))
  12.                 {
  13.                     txtInfo.Text = "信息:服务已经卸载";
  14.                 }
  15.             }
  16.         }

  17.         private void Stop_Click(object sender, RoutedEventArgs e)
  18.         {
  19.             if(IsServiceExist(_serviceName))
  20.             {
  21.                 StopService(_serviceName);
  22.                 txtInfo.Text = "信息:服务停止";
  23.             }
  24.         }

  25.         private void Start_Click(object sender, RoutedEventArgs e)
  26.         {
  27.             if(IsServiceExist(_serviceName))
  28.             {
  29.                 StopService(_serviceName);
  30.                 StartService(_serviceName);
  31.                 txtInfo.Text = "信息:服务启动";
  32.             }
  33.         }

  34.         private void Install_Click(object sender, RoutedEventArgs e)
  35.         {
  36.             if(!IsServiceExist(_serviceName))
  37.             {
  38.                 InstallService(_servicePath);
  39.                 txtInfo.Text = "信息:服务已安装";
  40.             }
  41.         }
复制代码
右击LogsManager,添加应用程序清单文件,这是很重要的一步,决定了服务能否成功安装。
2018-03-11 (5).png
立刻弹出这个界面
2018-03-11 (6).png
<requestedExecutionLevel level="asInvoker" uiAccess="false" /> 改为<requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> 至此才算大功造成,运行这个wpf项目,会弹出这个界面
2018-03-11 (7).png
点击使用其他凭据重新启动,visual studio 2017重新启动后,再运行程序,把先前的服务文件WriteLogs.exe 复制到wpf当前目录下,可以试试,安装服务,启动服务看看,一切OK。
WriteLogs.rar (79.23 KB, 下载次数: 5)
2018-03-11 (3).png
结帖率:42% (5/12)

签到天数: 23 天

发表于 2018-6-3 15:40:24 | 显示全部楼层   湖南省永州市
看一看瞧一瞧
回复 支持 反对

使用道具 举报

发表于 2018-3-13 18:14:28 | 显示全部楼层   安徽省合肥市
看一看瞧一瞧
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表