是否可以调试Quartz.NET Windows服务?

时间:2011-11-21 18:26:12

标签: asp.net-mvc quartz.net

  1. 我的应用程序代码在一个解决方案中,而Quartz.Net代码在另一个解决方案中。我的应用程序代码连接到服务并注册一个作业,但Quartz.NET解决方案中没有破坏点,尽管Quartz.Net代码的Visual Studio实例附加到服务进程。 (出于兴趣,在我的应用程序中注册作业时,我可以进入Quartz.Net源代码。它将源加载到我的应用程序的Visual Studio实例中。)

  2. 如果我将调试器从包含我的应用程序代码的Visual Studio实例附加到服务进程,那么我的自定义作业源代码中的断点就表示符号尚未加载,因此不会中断。包含自定义作业的dll不在模块列表中。

  3. 有什么想法吗?我所追求的是调试我的自定义作业,该作业在启动时由服务加载。包含我已复制到Quartz.net bin目录所在文件夹中的自定义作业的dll,因为作业实际运行,所以肯定加载好了!

    干杯,伊恩。

3 个答案:

答案 0 :(得分:0)

您是否还复制了自定义作业.pdb文件?

您也可以将构建目标更改为Quartz.Net文件夹,无需保留复制文件。

答案 1 :(得分:0)

我这样做的方法是在工作开始时有一些代码,如:

  if (System.Diagnostics.Debugger.IsAttached)
      System.Diagnostics.Debugger.Break(); 

然后我打开Visual Studio并将调试器附加到Quartz.Net服务。当作业开始时,它将进入调试器,然后我可以在其他地方添加断点。

答案 2 :(得分:0)

我要做的是创建一个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上查看完整的源代码。

相关问题