簡體   English   中英

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

[英]How to use a newer version of an assembly that Orchard uses

我想在Orchard CMS中實現自定義模塊。 問題是我想引用由各種Orchard CMS模塊使用的庫,這些模塊正在引用這些庫的較舊版本

我希望我的插件/模塊能夠自我維持-我不想要求對orchard.web的web.config文件進行修改。 我希望沒有果園地運行果園的用戶能夠使用我的模塊。

我該如何實現? 此頁面在綁定重定向方面或多或少地將我自己模塊的web.config描述為無意義的...我試圖將這些引用(相關的庫為System.IdentityModel.Tokens.JwtNewtonsoft.Json )放在bin目錄中從那里獲取模塊和參考,但是當我嘗試安裝模塊時,出現錯誤:

無法加載文件或程序集“ Newtonsoft.Json,版本= 9.0.0.0,區域性=中性,PublicKeyToken = 30ad4fe6b2a6aeed”或其依賴項之一。 找到的程序集的清單定義與程序集引用不匹配。

我已經閱讀了一些有關Orchard的App_Data/dependencies文件夾和orchard.web/bin文件夾的信息,但是我很難理解它們是如何結合在一起的。 如何允許我的模塊使用庫的新版本,同時仍允許果園模塊使用該庫的舊(不兼容)版本?

Orchard很好地給出了組成的應用程序的錯覺,該應用程序具有很少的全局,應用程序級別的實體,這些實體不能在模塊級別被覆蓋。 程序集加載是其中發生故障的地方之一。 在編譯和加載應用程序時,包括在動態編譯進入混合時,所有模塊生成並依賴的程序集將被收集並復制到全局應用程序的bin文件夾中。 實際上,模塊的bin文件夾只是復制程序集的位置,但實際加載是從應用程序的bin中進行的。 因此,最后,如果您想知道應用程序中到底加載了什么,則需要查看頂級bin文件夾。 如果您在這里找到了錯誤的版本,那么該是進一步挖掘並查看模塊具有哪些版本以及它們以什么順序提供的時間了。 如果我沒有記錯的話,那將取決於他們彼此之間的依賴關系,最外面的依賴關系將其程序集復制到最后,從而獲勝。 這意味着您可以通過調整清單中的模塊依賴順序來調整其功能。

全局的第二件事是程序集綁定配置,因為這正是ASP.NET的方式。 可以在目錄級別設置ASP.NET設置,但是程序集綁定需要在頂部進行,因為該應用程序最后只是一個應用程序域,並且每個程序集僅加載一個副本。 當然,這在任何模塊化應用程序中都是一個問題,因為模塊在編寫時對它們的依賴版本的期望不同。 .NET通過綁定重定向來處理此問題,這基本上是一種指示運行時僅假設加載特定版本后一切都會好的方法。 它還會假裝依賴那些重定向依賴項的程序集,因為它會假裝它們存在預期的版本,但實際上將使用重定向中指定的版本。 它通常有效,但並非總是如此(發生重大變化)。 而且,如果您重定向到的特定版本在GAC或應用程序的bin中實際上不可用,它將失敗。

因此,總而言之:

  • 模塊無法在其級別上統一應用程序將使用的程序集的版本,它需要是在應用程序級別設置的綁定重定向。
  • 重定向到的程序集必須在應用程序的bin中結束。
  • 通過更改清單中的依賴順序,模塊可以在一定程度上影響將哪些程序集部署到應用程序的bin(但這需要了解其他模塊)。

當然,理想情況下,所有第三方模塊以及Orchard核心模塊都將進行更新以使用最新版本,但這顯然很少是一種選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM