【问题标题】:Exception when using Quartz with Topshelf将 Quartz 与 Topshelf 一起使用时出现异常
【发布时间】:2020-03-16 04:20:39
【问题描述】:

尝试使用 Quartz 运行 Topshelf 时出现错误

Topshelf.Hosts.ConsoleRunHost Error: 0 : An exception occurred, System.TypeLoadException: Could not load type 
'Quartz.Collection.HashSet`1' from assembly 'Quartz, Version=3.0.7.0, Culture=neutral, PublicKeyToken=*'.
   at Topshelf.Quartz.ScheduleJobServiceConfiguratorExtensions.<>c__DisplayClassa`1.<ConfigureJob>b__3()
   at Topshelf.Runtime.EventCallbackList`1.Notify(T data)
   at Topshelf.Builders.DelegateServiceBuilder`1.DelegateServiceHandle.Start(HostControl hostControl)
   at Topshelf.Hosts.ConsoleRunHost.Run()

我的代码是

HostFactory.Run(x =>
        {
            x.Service<Service>(s =>
            {
                s.WhenStarted(service => service.Start());
                s.WhenStopped(service => service.Stop());
                s.ConstructUsing(() => new Service());

                s.ScheduleQuartzJob(q =>
                    q.WithJob(() =>
                            JobBuilder.Create<Notifications>().Build())
                        .AddTrigger(() => TriggerBuilder.Create()
                            .WithSimpleSchedule(b => b.WithIntervalInSeconds(10)
                                .RepeatForever())
                            .Build()));
            });

            x.RunAsLocalSystem()
                .StartAutomatically();

            x.SetDescription("Quartz Service");
            x.SetDisplayName("QuartzService");
            x.SetServiceName("QuartzService");
        });

我似乎无法通过谷歌搜索找到与 Quartz.Collection.Hashset 相关的任何内容,如果它丢失,我不确定如何获取它。

【问题讨论】:

  • 能否检查一下程序集Quartz, Version=3.0.7.0是否在可执行文件所在的目录下?
  • 我实际上无法在我的项目文件中找到 .exe。有没有我遗漏的步骤?
  • 在您的项目文件所在的文件夹中有一个子文件夹 bin\debug 。这是您的解决方案中已编译的 exe 和 dll 文件所在的位置。根据您的解决方案的结构,您的程序集的依赖关系可能不会在那里被复制。所以第一步是查看 Quartz dll 是否位于 \bin\debug.
  • 看一下,里面没有 Topshelf 或 Quartz 特定的 DLL。只是我的项目 DLL。
  • 试试这个:在 VS 中,转到引用 Quartz 和 Topshelf 的项目。在解决方案资源管理器中选择引用,选择属性选项卡并设置“CopyLocal”=“True”。如果这不能解决您的问题,请查看此帖子:stackoverflow.com/questions/602765/…

标签: c# assemblies quartz.net quartz topshelf


【解决方案1】:

我将此归结为 Quartz.Topshelf Nuget 包不支持 .net 核心,因此不得不求助于创建 Windows 服务。

看来您可以使用 .net core 3.0 及更高版本进行一些非常简单的服务创建。所以它使 Topshelf 几乎过时了。所以这绝对是一个更好的选择。

将此标记为答案,除非有人发现此问题并找到解决方案

【讨论】:

    【解决方案2】:

    您使用的 NuGet 包已过时。我遇到了确切的错误,不得不编写自己的集成。如果你在 NuGet 上使用 dtnuget 包,你肯定会遇到这个问题;该包最后一次更新是在 2015 年。最好的办法是使用由bertuko 发布的 NuGet 包。我已经将他的实现用作我自己的基础,并且效果很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-17
      相关资源
      最近更新 更多