【发布时间】:2015-07-21 17:55:49
【问题描述】:
我在控制台应用程序中运行 Quartz(尽管我已经在 ASP.NET 应用程序中重现了该行为)与远程 Quartz 服务器通信(通常的配置 - 客户端将线程设置为 0,远程服务器侦听端口 555 等.)。我遇到的问题与Could not load job assembly error in Quartz.NET 和Quartz.Net Initializing Project 相同。具体来说,在客户端调用 IScheduler.ScheduleJob() 时,我收到错误消息:
无法加载文件或程序集“SimpleJob.dll,版本...定位的程序集的清单定义与程序集引用不匹配”
正如您在上面的两个 Stackoverflow 链接中看到的那样,问题在于 Quartz 服务器不知道 IJob 类,并且解决方案是(引用第二个链接):“...copy/将 [客户端/控制台应用程序的程序集/可执行文件] 粘贴到 Quart.NET 服务文件夹中...一旦执行此操作,它将加载 [无论特定的 IJob 类是什么]...推荐的解决方案是...创建一个单独的 DLL对于您的每个 [job classes]...and..."(现在我的措辞)从服务器的项目中引用这些程序集。
我已经这样做了,但没有快乐。具体来说,我收到的第一个错误是找不到我的作业文件的程序集。那时,我将客户端的程序集 (.exe) 复制到服务器的 bin 文件夹中,并添加了对该程序集的引用 - 不走运。然后我将我的作业类分解为一个单独的程序集,并将该 .dll 复制到服务器的 bin 目录并添加对该程序集的引用 - 不走运。最后,我复制了我的工作的实际类文件 (.cs) 并将其包含在服务器服务器项目中,然后添加了一个参考 - 不走运。
让我澄清一下“没有运气”的含义。将作业类的程序集添加到服务器项目后,我仍然收到“无法加载文件或程序集...”错误,但现在是:
无法加载文件或程序集'Quartz.dll,版本...定位的程序集的清单定义与程序集引用不匹配'
此时,错误是抱怨 Quartz.dll,这对我来说毫无意义,因为该 dll(并且根据定义)在客户端和服务器的项目中都被引用,并且位于它们各自的 bin 文件夹中。
我的下一步是运行Process Monitor 并捕获特定程序集加载失败的位置。不高兴 - 搜索 SimpleJob.dll 和 Quartz.dll,在这两种情况下都看到了成功。 (回想起来,我不认为文件监控在这里是相关的,因为从文件系统的角度来看,特定的 dll 被读取,但程序集不是由 .net 加载的。进程监视器不会看到。)
最后我enabled assembly binding failure logging,查看了生成的日志,但无法识别故障。
欢迎提出建议...
【问题讨论】:
-
服务器上是否有 Quartz.dll,它与客户端上的 DLL 完全相同吗?
-
@MarkoLahma - 我删除了我之前的评论 - 结果我确实没有在两边都有相同的版本。好吧,至少在我重新编译了这两个项目之后我没有……这样做了。现在这个问题也完全有意义了。我想完整的答案是您写的内容和杰伊在下面写的内容的组合。如果你们中的一个人将它们组合成一个答案,我将标记为已接受。再次感谢。
标签: .net quartz-scheduler .net-assembly quartz.net