【问题标题】:Is it possible to debug the Quartz.NET Windows service?是否可以调试 Quartz.NET Windows 服务?
【发布时间】:2011-11-21 18:26:12
【问题描述】:
我的应用程序代码在一个解决方案中,Quartz.Net 代码在另一个解决方案中。我的应用程序代码连接到服务并注册了一个作业,但在 Quartz.NET 解决方案中没有遇到断点,尽管 Quartz.Net 代码的 Visual Studio 实例已附加到服务进程。 (出于兴趣,在我的应用程序中注册作业时,我可以进入 Quartz.Net 源代码。它将源代码加载到我的应用程序的 Visual Studio 实例中。)
如果我将调试器从包含我的应用程序代码的 Visual Studio 实例附加到服务进程,则我的自定义作业源代码中的断点表示符号尚未加载,因此不会中断.包含自定义作业的 dll 不在模块列表中。
有什么想法吗?我所追求的是调试服务启动时加载的自定义作业。包含我已复制到与 Quartz.net bin 目录相同的文件夹中的自定义作业的 dll 并且肯定加载正常,因为作业实际运行!
干杯,伊恩。
【问题讨论】:
标签:
asp.net-mvc
quartz.net
【解决方案1】:
您是否还复制了自定义作业 .pdb 文件?
您也可以将构建目标更改为 Quartz.Net 文件夹,无需保留副本文件。
【解决方案2】:
我这样做的方法是在工作开始时编写一些代码,例如:
if (System.Diagnostics.Debugger.IsAttached)
System.Diagnostics.Debugger.Break();
然后我打开 Visual Studio 并将调试器附加到 Quartz.Net 服务。当作业开始时,它会中断调试器,然后我可以在其他地方添加断点。
【解决方案3】:
我要做的是创建一个 Asp.Net 核心控制台应用程序,并使用应用程序可执行文件创建一个使用 sc 的 Windows 服务。下面是我的Program 课程。
using Backup.Service.Extensions;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
namespace Backup.Service
{
public class Program
{
static async Task Main(string[] args)
{
var isDebugging = !(Debugger.IsAttached || args.Contains("--console"));
var hostBuilder = new HostBuilder()
.ConfigureServices((context, services) =>
{
services.AddHostedService<BackupService>();
});
if (isDebugging)
{
await hostBuilder.RunTheServiceAsync();
}
else
{
await hostBuilder.RunConsoleAsync();
}
}
}
}
如果我们在本地/调试中运行应用程序,我们将调用扩展方法 RunConsoleAsync(),否则我们将调用我们自己的自定义扩展方法 RunTheServiceAsync()。
我已经写了一篇关于这个主题的完整文章,你可以阅读它here。也可以在 GitHub here 中查看完整的源代码。