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