C# 开发windows服务的一些心得
最近在做一个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 | );
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)
{
}
}
其它方式有待改进,暂不贴出
5服务的调试
个人知道的有两种服务调试的方式
1是用VS,附加到进程来做调试,步骤比较简单但也有缺点
(1)安装和启动一个服务以后,点击VS中的调试-->附加到进程(注意选择"附加到"这个选项,一定要是自己程序的代码,我用的.net4.0,所以我选择的是"托管4.0版代码")
(2)找到自己的程序进程,附加即可
这种方式的缺点:因为是在启动以后才可以附加到进程.服务的OnStart方法无法调试。所以我一般都会把代码放到OnStop方法里调试
2是做调试日志,每个步骤写日志的方式来检测服务是否正常启动等(我一直没用过,暂无介绍)不过个人认为这种方式也会有缺点.没有断点调试那样直观
不过有机会可以试试这种方式
多说都是泪,方法和思路都是自己试出来的,有什么代码或思路错误请朋友们提出,对的点个赞,谢谢~
感谢区:
由于不知道怎么把评论人的名字搞到这里来,所以只能这样感谢你们提出的意见了,谢谢~.~
C# 开发windows服务的一些心得的更多相关文章
- 使用Visual Studio 2015 Community 开发windows服务
昨天研究在.NET下开发Windows服务程序,期间遇到一些小问题,这里仅将自己的开发过程和需要注意的地方写下和广大网友分享…… 1.基础 Windows服务是指系统启动时能够自己运行的程序.W ...
- C#开发Windows服务 附简单实例实现禁止QQ运行
本实例主要实现下面三个基本功能 1.C#开发windows服务 2.禁止QQ等程序运行 3.为windows服务创建自动安装程序 下面针对这三个基本功能进行实现 一.C#开发windows服务 Win ...
- VS2013开发Windows服务项目
这篇随笔里,我将介绍如何用VS2013开发Windows服务项目,实现的功能是定时发送电子邮件. 开发环境:VS2013,SQL Server2008,采用C#语言开发 步骤一:创建Windows服务 ...
- C#开发Windows服务详细流程
1.Windows服务简单介绍 Windows服务程序是在Windows操作系统下能完成特定功能的可执行的应用程序,主要用于长时间运行的功能或者执行定时任务.一般情况下,用户不能通过用户界面来安装和启 ...
- 使用Topshelf开发Windows服务、log4net记录日志
开发windows服务,除了在vs里新建服务项目外(之前有写过具体开发方法,可点击查看),还可以使用Topshelf. 不过使用topshelf需要.netframework 4.5.2版本,在vs2 ...
- 开发Windows服务
在开发Windows服务时需要注意一点,如果在开发完成后,需要通过命令来进行安装的,那么在开发的时候,需要在服务类上面添加一个安装文件.如下图: 添加完成后,就 ...
- c#金额转换成中文大写金额 .Net开发Windows服务
c#金额转换成中文大写金额 2018-08-24 转别人 c#金额转换成中文大写金额 /// <summary> /// 金额转换成中文大写金额 /// </summary> ...
- C# DateTime的11种构造函数 [Abp 源码分析]十五、自动审计记录 .Net 登陆的时候添加验证码 使用Topshelf开发Windows服务、记录日志 日常杂记——C#验证码 c#_生成图片式验证码 C# 利用SharpZipLib生成压缩包 Sql2012如何将远程服务器数据库及表、表结构、表数据导入本地数据库
C# DateTime的11种构造函数 别的也不多说没直接贴代码 using System; using System.Collections.Generic; using System.Glob ...
- C#开发windows服务如何调试——资料整理
原文标题:C# Windows服务程序如何进行调试 原文地址:https://jingyan.baidu.com/article/456c463b18e1b00a583144b3.html 第一种: ...
随机推荐
- C语言 · 时间转换
问题描述 给定一个以秒为单位的时间t,要求用"<H>:<M>:<S>"的格式来表示这个时间.<H>表示时间,<M>表示分 ...
- 2D、3D形变
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Monaco; color: #a5b2b9 } span.Apple-tab-span { ...
- 如何进行python性能分析?
在分析python代码性能瓶颈,但又不想修改源代码的时候,ipython shell以及第三方库提供了很多扩展工具,可以不用在代码里面加上统计性能的装饰器,也能很方便直观的分析代码性能.下面以我自己实 ...
- SQL Server-聚焦计算列或计算列持久化查询性能(二十二)
前言 上一节我们详细讲解了计算列以及计算列持久化的问题,本节我们依然如前面讲解来看看二者查询性能问题,简短的内容,深入的理解,Always to review the basics. 持久化计算列比非 ...
- Xamarin+Prism小试牛刀:定制跨平台Outlook邮箱应用(后续)
在[Xamarin+Prism小试牛刀:定制跨平台Outlook邮箱应用]里面提到了Microsoft 身份认证,其实这也是一大块需要注意的地方,特作为后续补充这些知识点.上章是使用了Microsof ...
- javascript 判断参数类型大全
js 判断类型的在开发中是很常用的,因为js 是弱类型的语言,var 可以接受任何形式的类型,但是在真正的开发中,我们需要根据不同类型做不同的处理,所以这个是必须的精通. 首先需要知道 typeof这 ...
- 【iOS】Xcode8+Swift3 纯代码模式实现 UICollectionView
开发环境 macOS Sierra 10.12.Xcode 8.0,如下图所示: 总体思路 1.建立空白的storyboard用于呈现列表 2.实现自定义单个单元格(继承自:UICollectionV ...
- ASP.NET MVC5----常见的数据注解和验证
只要一直走,慢点又何妨. 在使用MVC模式进行开发时,数据注解是经常使用的(模型之上操作),下面是我看书整理的一些常见的用法. 什么是验证,数据注解 验证 从全局来看,发现逻辑仅是整个验证的很小的一部 ...
- BPM流程中心解决方案分享
一.需求分析 在过去办公自动化的浪潮中,很多企业已经实施了OA流程,但随着客户的发展和对流程管理的越来越重视, 客户对流程应用需求越来越深 入,您可能面临以下需求: 1.流程功能不能满足需求,包括流程 ...
- Android中使用ViewFlipper实现屏幕页面切换(关于坐标轴的问题已补充更改)
屏幕切换指的是在同一个Activity内屏幕间的切换,ViewFlipper继承了Framelayout类,ViewAnimator类的作用是为FrameLayout里面的View切换提供动画效果.如 ...