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

问题描述 投票:0回答:1

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

对象序列化器类型'Quartz.Simpl.BinaryObjectSerializer,Quartz'可以实例化机器人。

因此,似乎(部分)库丢失或未正确加载(当在磁盘上找不到整个库或作为嵌入式资源时,会出现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有关,并且仍应通过首先将嵌入式文件写入磁盘,然后将其读取为seen here来从磁盘加载。但是,直接将库作为一个单独的文件添加就一样容易。

所以有人知道如何解决该错误并使其正常工作吗?

c# .net wpf embedded-resource quartz
1个回答
0
投票

终于找到了解决方法。

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

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();
© www.soinside.com 2019 - 2024. All rights reserved.