调试windows服务经历磨难重重 查看了很多文章一直没有调出来特此记录下
1、调试windows 服务是system级别的所有在win7或win8下一定要以管理员身份启动,启动后添加新建项目windows服务
确定就建立了一个windows服务程序
2、程序入口点自然在program中 main函数 跟控制台程序有点相似
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
static void Main()
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new Service1()
};
ServiceBase.Run(ServicesToRun);
}
}
public partial class Service1 : ServiceBase
{
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
}
protected override void OnStop()
{
}
}
service1是集成于ServiceBase的子类 入口是一个父类ServiceBase数组 在创建数组的时候初始化所有的服务对象即创建你所写的服务类的对象,这里按照你服务的多少new多少个。
ServiceBase.Run(ServicesToRun); 父类静态方法调用RUN 传递父类对象数组,在RUN方法内遍历对象数组每一项调用 子类的OnStart 方法,当然可在OnStart 方法里面传递字符串类型的数组参数 当服务关闭的时候会调用OnStop方法。
生成下那么你就生成了一个服务的应用程序,那么怎么运行呢?双击.exe文件那是不行的,因为它是服务不成可执行程序,那么需要注册安装
3、在service1.cs 页面中右键添加安装程序
设置安装程序为本地服务:
生成后就可以安装了
下面我们安装下服务,可以按照网上教程安装,安装方法是使用VS .netframework中的一个installutil.exe的安装程序 当然运行的话再WIN7/WIN8下需要获取管理员权限
右键以管理员身份运行程序 使用 installutil 路径/WindowsService2.exe 即可安装服务 安装成功后 可以在windows服务管理面看到Service1 的服务 服务的名称是以你继承到ServiceBase基类的子类的类名为服务名称。
如果从CMD窗口打开安装提示installutil 不是内部命令说明此installutil .exe 不在系统环境变量里面找不到,按VS提供的命令行不会出现找不到的情况。
如果运行提示:
那么说明路径不对或者名称错误/或者路径中有空格 空格会认为是隔断开的 所以一定要注意路径问题。
安装成功会有提示: 已完成事务处理安装
同时看到增加了几个文件 还有日志:
剩下就是在服务管理器中找你的服务吧 CMD窗口 services.msc 打开服务 启动你自己的服务
看我的服务
右键即可启动即可,在进程管理器中看到此服务 用户级别为system
4、卸载服务:installutil /u 路径文件
、
5、如何调试?
启动VS要求以管理员身份启动 因为调试的system服务,使用调试-》附加到进程
如果看不到进程那么说明你没有勾选下面的选项,勾选即可看到服务。选中附加即可。
有时候附加也无法调试:
1、修改你生成的方式是debug而不是release
2、附加到进行设置的断点确实是可以运行到的断点,因为服务启动在前,那么启动初期的则无法调试断点 ,可以添加time 让程序延时1分钟或几十秒 够你有时候来附加进程即可
从现在开始设计你的windows服务程序吧