Исключение при использовании Quartz с Topshelf.

Я получаю сообщение об ошибке при попытке запустить Topshelf с Quartz

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 с помощью поиска в Google, и я не уверен, как его получить, если он отсутствует.


person Maze90    schedule 20.11.2019    source источник
comment
Можете ли вы проверить, находится ли сборка Quartz, Version = 3.0.7.0 в каталоге, в котором находится исполняемый файл?   -  person Stefan    schedule 20.11.2019
comment
На самом деле я не могу найти .exe в своих файлах проекта. Я пропустил какой-то шаг?   -  person Maze90    schedule 20.11.2019
comment
В папке, где находится файл вашего проекта, есть подпапка bin \ debug. Здесь находятся скомпилированные файлы exe и dll из вашего решения. В зависимости от того, как структурировано ваше решение, возможно, что зависимости ваших сборок не будут скопированы туда. Итак, первый шаг - проверить, находится ли Quartz dll в ‹YourProjectFolder› \ bin \ debug.   -  person Stefan    schedule 20.11.2019
comment
Глядя на это, там нет ни одной специфической DLL Topshelf или Quartz. Только мои проектные DLL.   -  person Maze90    schedule 20.11.2019
comment
Попробуйте следующее: в VS перейдите к своему проекту, который ссылается на Quartz и Topshelf. В обозревателе решений выберите ссылку, перейдите на вкладку свойств и установите CopyLocal = True. Если это не решит вашу проблему, взгляните на этот пост: stackoverflow.com/questions/602765/   -  person Stefan    schedule 20.11.2019
comment
Ни в одном из проектов, на которые я ссылаюсь, нет Quartz of Topshelf, он установлен в правильном проекте, но пакеты nuget сохраняются в другом месте, чем сам проект.   -  person Maze90    schedule 21.11.2019


Ответы (2)


Я объяснил это тем, что пакет Nuget Quartz.Topshelf не поддерживает ядро ​​.net, и вместо этого пришлось прибегнуть к созданию службы Windows.

Похоже, вы можете сделать очень простое создание службы с .net core 3.0 и выше. Так что это делает Topshelf в значительной степени устаревшим. Так что это определенно лучший вариант.

Пометить это как ответ, если только кто-то не найдет этот вопрос и не найдет решение

person Maze90    schedule 21.11.2019

Пакет NuGet, который вы используете, устарел. Я столкнулся с точной ошибкой, и мне пришлось написать свою собственную интеграцию. Если вы используете пакет dtnuget в NuGet, у вас определенно возникнет эта проблема; последний раз этот пакет обновлялся в 2015 году. Лучше всего использовать пакет NuGet, опубликованный bertuko . Я использовал его реализацию как основу для себя, и она отлично работает.

person Curtis    schedule 25.10.2020