.Net Core 程序集管理說明(加載)


.NET CORE 的程序集加載管理和以前的 .NET 發生了很大的變化, 在 .NET CORE 里, 程序集的加載, 依賴了 xx.deps.json 文件, deps.json 文件里,定義了程序所需有的所有程序集以前程序集之間的依賴關系。

所以如果程序集的信息沒有定義在 deps.json 文件里, 程序集是不會加載的。

 

程序集的依賴關系,可以通過 DependencyContext 類來處理, 通過 Load(程序集) 的方式,來獲取程序集的依賴信息, 但是這個 DependencyContext 類也是通過加載 deps.json 文件里的程序, 如有個程序集叫 a.dll 文件, 那就就需要定義一個 a.deps.json 文件, 如果沒有定義這個文件, 那么 DependencyContext.Load 將返回 null。

下面為一段 System.Data.Odbc 程序集的定義:

"System.Data.Odbc/4.7.0": {
        "dependencies": {
          "Microsoft.NETCore.Platforms": "3.1.0"
        },
        "runtime": {
          "lib/netstandard2.0/System.Data.Odbc.dll": {
            "assemblyVersion": "4.0.2.0",
            "fileVersion": "4.700.19.56404"
          }
        },
        "runtimeTargets": {
          "runtimes/freebsd/lib/netcoreapp2.0/System.Data.Odbc.dll": {
            "rid": "freebsd",
            "assetType": "runtime",
            "assemblyVersion": "4.0.2.0",
            "fileVersion": "4.700.19.56404"
          },
          "runtimes/linux/lib/netcoreapp2.0/System.Data.Odbc.dll": {
            "rid": "linux",
            "assetType": "runtime",
            "assemblyVersion": "4.0.2.0",
            "fileVersion": "4.700.19.56404"
          },
          "runtimes/osx/lib/netcoreapp2.0/System.Data.Odbc.dll": {
            "rid": "osx",
            "assetType": "runtime",
            "assemblyVersion": "4.0.2.0",
            "fileVersion": "4.700.19.56404"
          },
          "runtimes/win/lib/netcoreapp2.0/System.Data.Odbc.dll": {
            "rid": "win",
            "assetType": "runtime",
            "assemblyVersion": "4.0.2.0",
            "fileVersion": "4.700.19.56404"
          }
        },
        "compile": {
          "ref/netstandard2.0/System.Data.Odbc.dll": {}
        }
      }

  

此段定義了 system.data.odbc 程序集的依賴, 以前程序集在每個平台運行的目標程集, 還有編譯時的程序集。通過 DependencyContext 都可以獲取到這些信息:

CompileLibraries: 編譯時的庫

RuntimeLibraries:運行時的庫

RuntimeLibraries 返回的都是一個 RuntimeLibrary 對象集合, RuntimeLibrary 對象又可以通過 RuntimeAssemblyGroups 屬性來獲取 runtimeTargets 節點的屬性。

 

奇怪的時 DependencyContext 沒有獲取依賴庫的信息, 通過 CompileLibraries 獲取不到依賴的庫信息, 上面雖然有定義,但是在測試的時候還是返回為 null。竟然通過 DependencyContext 獲取不到引用的程序集, 就通過 Assembly 對象的 GetReferencedAssemblies 方法來獲取。

 

.NET CORE 在加載程序集的時候,只會加載程序集本身, 而不會去加載引用的程序集,而在程序集使用到引用的程序集時, 才會去判斷是否有加載, 這個加載過程就是通過 AssemblyLoadContext 的 Resolving 事件來加載, 當 .NET CORE 程序在運行的時候,遇到一個沒有加載過的程序集,則會引發 Resolving 事件,這個事件里必須返回一個 Assembly 對象, 如果返回 null 則會提示程序集加載失敗。

.NetCore 默認處理了 Resolving 事件,通過入口 程序集的 deps.json 信息來加載, 所以沒有在 deps.json 文件中定義的程序集是不會加載的。

可以看一下 AssemblyLoadContext 類的官方文檔,文檔內容比簡單,通過好多測試才明白 Resolving 事件。

https://docs.microsoft.com/zh-cn/dotnet/api/system.runtime.loader.assemblyloadcontext?view=netcore-3.0

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM