c# - 如何使用 Orchard 使用的程序集的新版本

标签 c# .net orchardcms

我想在 Orchard CMS 中实现自定义模块。问题是我想引用各种 Orchard CMS 模块使用的库,这些模块引用这些库的旧版本

我希望我的插件/模块能够 self 维持 - 我不想要求对 orchard.web 的 web.config 文件进行修改。我希望在没有源征召的情况下运行 orchard 的用户能够使用我的模块。

我怎样才能实现这个目标? This page描述我自己的模块的 web.config 在绑定(bind)重定向方面或多或少毫无意义......我尝试只放置这些引用(有问题的库是 System.IdentityModel.Tokens.JwtNewtonsoft.Json) 在我的模块的 bin 目录中并从那里引用,但是当我尝试安装该模块时出现错误:

Could not load file or assembly 'Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference.

我已经阅读了一些有关 Orchard 的 App_Data/dependencies 文件夹和 orchard.web/bin 文件夹的信息,但我无法理解它们是如何组合在一起的。如何允许我的模块使用新版本的库,同时仍然允许 orchard 模块使用该库的旧(不兼容)版本?

最佳答案

Orchard 很好地给人一种组合应用程序的错觉,其中很少有全局的、应用程序级的实体,这些实体不能在模块级被覆盖。然而,程序集加载是发生故障的地方之一。当应用程序被编译和加载时,包括当动态编译加入时,所有模块生成和依赖的程序集将被收集并复制到全局应用程序的 bin 文件夹中。模块的 bin 文件夹实际上只是从中复制程序集的位置,但实际加载发生在应用程序的 bin 中。所以最后,如果您想知道应用程序中到底加载了哪些内容,您需要查看顶级 bin 文件夹。如果您在这里发现错误的版本,那么是时候进一步挖掘并查看模块具有哪些版本以及它们贡献的顺序。如果我没记错的话,这将取决于它们之间的依赖关系,最外层的依赖关系最后复制它们的程序集,从而获胜。这意味着您可能有能力通过调整 list 中的模块依赖顺序来调整它的组成部分。

第二件事是全局的,因为这就是 ASP.NET 的方式,那就是程序集绑定(bind)配置。可以在目录级别设置 ASP.NET 设置,但程序集绑定(bind)需要在顶部进行,因为应用程序最终只是一个应用程序域,并且只会加载每个程序集的一份副本。当然,这在任何模块化应用程序中都是一个问题,因为模块在编写时对其依赖项的版本有不同的期望。 .NET 通过绑定(bind)重定向来处理这个问题,这基本上是一种指示运行时假设如果加载特定版本一切都会好的方法。它还会告诉依赖于这些重定向依赖项的程序集一个谎言,因为它假装它们期望的版本存在,但实际上会使用重定向中指定的版本。它通常有效,但并非总是有效(发生了重大变化)。如果您重定向到的特定版本实际上不可用,无论是在 GAC 中还是在应用程序的 bin 中,它都会失败。

总结一下:

  • 模块无法在其级别上执行任何操作来统一应用程序将使用的程序集的版本,它需要是在应用程序级别设置的绑定(bind)重定向。
  • 被重定向到的程序集必须最终位于应用的 bin 中。
  • 通过更改 list 中的依赖顺序,模块可以在一定程度上影响部署到应用程序 bin 的程序集(但这需要了解其他模块)。

当然,理想情况下,所有第三方模块以及 Orchard 核心模块都会更新以使用最新版本,但这显然很少是一种选择。

关于c# - 如何使用 Orchard 使用的程序集的新版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48759827/

相关文章:

c# - 为什么 System.Type.IsPublic 返回为 false?

c# - 通过从dll中获取文件来读取文件的内容

c# - 为什么我在同一台计算机上通过 IIS 和 Visual Studio 的 Web 服务器运行我的应用程序时得到不同的日期格式?

c# - 在#endregion 处自动创建同名的#region

.net - "Must Know".NET Architect/Lead 的 IIS 功能

c# - 如何在 Orchard CMS 数据库中保存自定义数据

sql - 如何在内容类型中最好地集成现有数据库数据

c# - 我如何写一个 "events per second"PerformanceCounter?

.net - SQL 查询中的转义字符

azure - Orchard NHibernate.Linq 错误