使用 Quartz.net 时无法加载类型 System.Configuration.ConfigurationManager

Posted

技术标签:

【中文标题】使用 Quartz.net 时无法加载类型 System.Configuration.ConfigurationManager【英文标题】:Could not load type System.Configuration.ConfigurationManager while using Quartz.net 【发布时间】:2021-12-02 14:58:58 【问题描述】:

我刚刚开始使用 Quartz.NET 调度程序。我只是从https://www.quartz-scheduler.net/documentation/quartz-3.x/tutorial/using-quartz.html 复制代码来检查工作。

static async Task Main(string[] args)

    Console.WriteLine("Hello World!");
    // construct a scheduler factory using defaults
    StdSchedulerFactory factory = new StdSchedulerFactory();

    // get a scheduler
    IScheduler scheduler = await factory.GetScheduler();
    await scheduler.Start();

    // define the job and tie it to our HelloJob class
    IJobDetail job = JobBuilder.Create<HelloJob>()
                .WithIdentity("myJob", "group1")
                .Build();

    // Trigger the job to run now, and then every 40 seconds
    ITrigger trigger = TriggerBuilder.Create()
                .WithIdentity("myTrigger", "group1")
                .StartNow()
                .WithSimpleSchedule(x => x
                    .WithIntervalInSeconds(40)
                    .RepeatForever())
            .Build();

    await scheduler.ScheduleJob(job, trigger);

但即使在明确添加 System.Configuration.ConfigurationManager dll 后,我也会收到以下消息。

  System.Configuration.ConfigurationManager in the System.TypeLoadException
  HResult=0x80131522
  Message=Could not load type 'System.Configuration.ConfigurationManager' from assembly 'System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.
  Source=Quartz
  StackTrace:
   at Quartz.Util.Configuration.GetSection(String sectionName)
   at Quartz.Impl.StdSchedulerFactory.InitializeProperties(ILog logger, Boolean throwOnProblem)
   at Quartz.Impl.StdSchedulerFactory.Initialize()
   at Quartz.Impl.StdSchedulerFactory.<GetScheduler>d__69.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at Scheduler.Program.<Main>d__0.MoveNext()

这是我的解决方案的目录结构。

请有人建议我如何解决这个问题。

【问题讨论】:

您有 .NET Core 应用程序或 .NET Standard 吗?该库应该与哪个库一起使用? :) 我项目的目标框架是 .NET 5。“Quartz.NET 支持 .NET Core/netstandard 2.0 和 .NET Framework 4.6.1 及更高版本。” ,正如官方文档所述,ConfigurationManager dll 是从此路径system.configuration.configurationmanager.5.0.0.nupkg\lib\net461\System.Configuration.ConfigurationManager.dll 引用的。根据 .nupkg 文件中提到的版本,它应该支持我的解决方案的目标框架。 【参考方案1】:

您引用的 DLL system.configuration.configurationmanager.5.0.0.nupkg\lib\net461\ 是为 .NET 版本 4.6.1 构建的。

不幸的是,您的应用程序面向 .NET 版本 5 - 它基于 .NET Core 实现,如 official docs 中所述。

分辨率应该是:

System.Configuration.ConfigurationManager 引用到 DLL 版本 .NET Core.NET 5。 或将应用程序的基础更改为 .NET Framework 4.6.2 及更高版本(必须是 .NET FW

【讨论】:

以上是关于使用 Quartz.net 时无法加载类型 System.Configuration.ConfigurationManager的主要内容,如果未能解决你的问题,请参考以下文章

Quartz.Net 创建作业插件架构

Quartz.net持久化与集群部署开发详解

Quartz.net持久化与集群部署开发详解

Easymodbus 在 Quartz.net 类中给出连接错误

quartz.net 基于数据库的简单实现

开源作业调度框架 - Quartz.NET - 实战使用2