如何使用Orchard使用的较新版本的程序集

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

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

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

我怎样才能做到这一点? This page描述我自己的模块的web.config在绑定重定向方面或多或少没有意义......我尝试将这些引用(有问题的库是System.IdentityModel.Tokens.JwtNewtonsoft.Json)放在我的模块的bin目录中并从那里引用,但是当我尝试安装模块我收到一个错误:

无法加载文件或程序集'Newtonsoft.Json,Version = 9.0.0.0,Culture = neutral,PublicKeyToken = 30ad4fe6b2a6aeed'或其中一个依赖项。定位的程序集的清单定义与程序集引用不匹配。

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

c# .net orchardcms
1个回答
3
投票

Orchard很好地使用很少的全局应用程序级实体来给出组合应用程序的错觉,这些实体无法在模块级别被覆盖。然而,装配加载是其发生故障的地方之一。编译和加载应用程序时,包括动态编译进入混合时,所有模块生成和依赖的程序集都会被收集并复制到全局应用程序的bin文件夹中。模块的bin文件夹实际上只是从中复制程序集的位置,但实际加载是从应用程序的bin发生的。所以最后,如果你想知道究竟是什么加载到应用程序中,你需要查看顶级bin文件夹。如果您在此处找到了错误的版本,则需要进一步挖掘并查看模块的版本以及它们所贡献的顺序。如果我没有弄错,那将取决于他们之间的依赖关系,最外层的依赖关系让他们的程序集最后复制,从而获胜。这意味着你可以通过调整清单中的模块依赖顺序来调整是什么原因。

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

总结如下:

  • 在他们的级别上没有任何模块可以统一应用程序将使用的程序集的版本,它需要是应用程序级别的绑定重定向集。
  • 重定向到的程序集必须最终位于应用程序的bin中。
  • 模块可以通过在其清单中更改其依赖顺序(但需要了解其他模块),在一定程度上影响部署到应用程序bin的程序集。

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

© www.soinside.com 2019 - 2024. All rights reserved.