作为嵌入式资源的 Quartz 库无法正确加载

Quartz Library as Embedded Resource does not load correctly

在我的应用程序中,我使用作为嵌入式资源添加到可执行文件的外部库。然后,当加载应用程序时,以下代码片段会从资源中加载库,因此您不需要将它们作为单独的文件放在同一文件夹中。原始代码来自 this blog(嵌入文件位于根目录中的文件夹 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。但是当应用程序是 运行 时,它会抛出错误

Object serializer type 'Quartz.Simpl.BinaryObjectSerializer, Quartz' could bot be instantiated.

所以似乎有一个(部分)库丢失或未正确加载(当整个库在磁盘上或作为嵌入式资源找不到时,您会收到 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 次,这次在程序集引用名称中没有 Version 和 Culture。还有一个叫做 Serilog?

的东西

我找到的唯一可能的答案是它与它是一个 Unmanaged DLL 有关并且它仍然应该通过首先将嵌入文件写入磁盘然后将其读取为 [=] 从磁盘加载23=]。但是,直接将库作为单独的文件添加会很容易。

那么有没有人知道如何修复错误并使其正常工作?

终于找到解决办法了。

我在构建调度程序时指定了序列化属性

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();