【问题标题】:Quartz.NET scheduler - Getting error "Could not load file or assembly 'SimpleJob..." when submitting job on remote serverQuartz.NET调度程序 - 在远程服务器上提交作业时出现错误“无法加载文件或程序集'SimpleJob ...”
【发布时间】:2015-07-21 17:55:49
【问题描述】:

我在控制台应用程序中运行 Quartz(尽管我已经在 ASP.NET 应用程序中重现了该行为)与远程 Quartz 服务器通信(通常的配置 - 客户端将线程设置为 0,远程服务器侦听端口 555 等.)。我遇到的问题与Could not load job assembly error in Quartz.NETQuartz.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


【解决方案1】:

对于客户端和服务器,您是否将具有作业定义的程序集与 quart.dll 放在同一文件夹中?双方的版本也必须完全相同。

【讨论】:

  • 我愿意(重新验证)。请参阅上面我对 Marko 的评论 - 我遇到了 Quartz.dll 的版本问题,这是我问题的根源。我对自己在发布问题之前没有正确验证这一点感到失望。谢谢...
猜你喜欢
  • 1970-01-01
  • 2016-10-07
  • 2011-08-12
  • 1970-01-01
  • 1970-01-01
  • 2019-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多