【问题标题】:Is it possible to debug the Quartz.NET Windows service?是否可以调试 Quartz.NET Windows 服务?
【发布时间】:2011-11-21 18:26:12
【问题描述】:
  1. 我的应用程序代码在一个解决方案中,Quartz.Net 代码在另一个解决方案中。我的应用程序代码连接到服务并注册了一个作业,但在 Quartz.NET 解决方案中没有遇到断点,尽管 Quartz.Net 代码的 Visual Studio 实例已附加到服务进程。 (出于兴趣,在我的应用程序中注册作业时,我可以进入 Quartz.Net 源代码。它将源代码加载到我的应用程序的 Visual Studio 实例中。)

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

有什么想法吗?我所追求的是调试服务启动时加载的自定义作业。包含我已复制到与 Quartz.net bin 目录相同的文件夹中的自定义作业的 dll 并且肯定加载正常,因为作业实际运行!

干杯,伊恩。

【问题讨论】:

    标签: asp.net-mvc quartz.net


    【解决方案1】:

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

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

    【讨论】:

    • 是的,我确实复制了自定义作业 .pdb。
    【解决方案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 中查看完整的源代码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多