调试windows服务最简单的方法之一
先看一下这段启动代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceProcess;
using System.Text;
namespace WindowsService1
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
static void Main()
{
Service1 s = new Service1();
if (Environment.UserInteractive)
{
s.DebugStart();
Console.ReadKey();
s.DebugStop();
}
else
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[] { s };
ServiceBase.Run(ServicesToRun);
}
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.ServiceProcess;
using System.Text;
namespace WindowsService1
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
static void Main()
{
Service1 s = new Service1();
if (Environment.UserInteractive)
{
s.DebugStart();
Console.ReadKey();
s.DebugStop();
}
else
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[] { s };
ServiceBase.Run(ServicesToRun);
}
}
}
}
关键就在对Environment.UserInteractive的判断上,
请看MSDN上面的解释:
获取一个值,用以指示当前进程是否在用户交互模式中运行。
UserInteractive 属性为运行时无用户界面的 Windows 进程或一个服务(如 IIS)报告 false。 如果此属性为 false,请不要显示模式对话框或消息框,因为没有用来与用户进行交互的图形用户界面。
http://msdn.microsoft.com/zh-cn/library/system.environment.userinteractive(v=VS.100).aspx
然后看一下Service1.cs中的代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
namespace WindowsService1
{
public partial class Service1 : ServiceBase
{
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
this.ServiceStart();
}
protected override void OnStop()
{
this.ServiceStop();
}
internal void DebugStart()
{
this.ServiceStart();
}
internal void DebugStop()
{
this.ServiceStop();
}
private void ServiceStart()
{
// TODO:
}
private void ServiceStop()
{
// TODO:
}
}
}
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
namespace WindowsService1
{
public partial class Service1 : ServiceBase
{
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
this.ServiceStart();
}
protected override void OnStop()
{
this.ServiceStop();
}
internal void DebugStart()
{
this.ServiceStart();
}
internal void DebugStop()
{
this.ServiceStop();
}
private void ServiceStart()
{
// TODO:
}
private void ServiceStop()
{
// TODO:
}
}
}
最后:更改Project的输出类型
右击该Project,点击Properties,在Application标签中,更改Output Type为Console Application。
OK啦,按F5试试