我需要调试Windows服务,从Visual Studio我无法运行服务,因此我使用的是Installutil.exe。
所以在每次构建之后我都使用Installutil.exe,但我无法在我的代码中一步一步地进行。
你知道任何简单的方法:
由于
答案 0 :(得分:3)
您可以使用Log4Net之类的记录器来写入文件,但如果您想调试,可以使用attach the debugger to a running process。
答案 1 :(得分:1)
所以在每次构建之后我都使用Installutil.exe,但我无法继续前进 进入我的代码。
如果要在Visual Studio中调试服务,则可以执行以下操作。
在Program.cs
文件中定义:
private static void RunService()
{
var service = new YourService();
System.ServiceProcess.ServiceBase.Run(service);
}
//for debug only
private static void RunNoService()
{
using (var service = new YourService())
{
service.Start();
System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
}
}
在Main
方法
static void Main()
{
if (Environment.UserInteractive) //This is IMPORTANT
RunNoService();
else
RunService();
}
在您的服务中定义Start
方法,该方法具有OnStart
的功能,将您的OnStart
方法修改为:
protected override void OnStart(string[] args)
{
Start();
}
Environment.UserInteractive
将检查是否正在从Visual Studio运行该服务并让您调试它。
用于记录:
始终在您的服务中记录您的活动。这将有助于您在生产中调试服务。您可以使用Log4Net,也可以创建自己的自定义类进行日志记录。即使记录到一个简单的文本文件也比没有任何东西更好。但是你必须保留日志,否则如果生产中出现问题,它可能会变得非常令人沮丧。
答案 2 :(得分:1)
要在Visual Studio中调试服务,我在服务项目中使用此代码:
在 Program.cs :
中 static class Program
{
#if DEBUG
static AutoResetEvent sare = new AutoResetEvent(false);
#endif
static void Main()
{
#if (!DEBUG)
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[] { new Service() };
ServiceBase.Run(ServicesToRun);
#else
Service service = new Service();
service.DebugServiceStopped += new Action(SetAutoResetEvent);
service.DebugStart();
sare.WaitOne();
#endif
}
#if DEBUG
private static void SetAutoResetEvent()
{
sare.Set();
}
#endif
}
在 Service.cs (实际Service
类的文件)中,您需要添加以下代码部分:
#if DEBUG
public event Action DebugServiceStopped;
public void DebugStart()
{
OnStart(null);
}
#endif
protected override void OnStop()
{
#if DEBUG
DebugServiceStopped();
#endif
}
如果在Visual Studio中选择Debug
作为配置,您将能够像普通应用程序一样调试服务,否则项目将被编译为真实服务。
<强>日志记录:强> 在Windows上有 Windows事件日志,用于存储应用程序的信息,警告和错误。在服务中,事件日志可以写入:
EventLog.WriteEntry("your log message", EventLogEntryType.Information); // or EventLogEntryType.Error,... depending on the entry type