Кварцевая библиотека как встроенный ресурс загружается неправильно - PullRequest
0 голосов
/ 31 октября 2019

В своем приложении я использую внешние библиотеки, которые добавляются в исполняемый файл как встроенный ресурс. Затем, когда приложение загружено, следующий фрагмент кода загружает библиотеки из ресурсов, поэтому вам не нужны они в одной папке с отдельными файлами. Оригинальный код взят из этого блога (встроенные файлы находятся в папке Resources, которая находится в корне, следовательно, {0}.Resources.{1})

AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => {
    string resourceName = string.Format("{0}.Resources.{1}.dll", Assembly.GetExecutingAssembly().GetName().Name, new AssemblyName(args.Name).Name);
    using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
    {
        byte[] assemblyData = new byte[stream.Length];
        stream.Read(assemblyData, 0, assemblyData.Length);
        return Assembly.Load(assemblyData);
    }
};

Это прекрасно работает длякуча разных библиотек. Но теперь я хотел добавить библиотеку Quartz.Net V 3.0.7.0. Но когда приложение запускается, оно выдает ошибку

Объектный сериализатор типа 'Quartz.Simpl.BinaryObjectSerializer, Quartz' может быть запущен.

Так что, похоже, что естьa (часть) библиотеки отсутствует или загружается неправильно (когда вся библиотека не найдена на диске или как встроенный ресурс, вы получаете ошибку Could not load file or assembly 'Quartz'). Обратите внимание, что единственный файл, необходимый для правильной работы, когда он не встроен, - это Quartz.dll, поэтому нет пропущенных файлов.

Когда я проверяю args.Name переменных в приведенном выше фрагменте при загрузке, он дает следующие значения

Quartz, Version=3.0.7.0, Culture=neutral, PublicKeyToken=f6b8c98a402cc8a4
Serilog
Quartz
Quartz

Таким образом, кажется, что код пытается загрузить Quartz 2 раза, на этот раз без справочного имени версии и культуры в сборке. И что-то под названием Serilog?

Единственный возможный ответ, который я нашел, заключался в том, что он как-то связан с Unmanaged DLL и что он все равно должен загружаться с диска, сначала записав встроенный файл на диск изатем читаем это как увиденное здесь . Но тогда было бы так же просто добавить библиотеку непосредственно в виде отдельного файла.

Так есть ли у кого-нибудь идея, как исправить ошибку и заставить ее работать?

1 Ответ

0 голосов
/ 12 ноября 2019

Наконец-то найдено решение.

Я указал свойства сериализации при построении планировщика

NameValueCollection properties = new NameValueCollection { 
    { "quartz.serializer.type", "binary" } 
};
StdSchedulerFactory factory = new StdSchedulerFactory(properties);
scheduler = await factory.GetScheduler();
await scheduler.Start();

Решением было не задавать какие-либо свойства.

StdSchedulerFactory factory = new StdSchedulerFactory();
scheduler = await factory.GetScheduler();
await scheduler.Start();
...