.NET Core 3.0 可回收程序集加載上下文的實現(xiàn)
一、前世今生
.NET誕生以來,程序集的動態(tài)加載和卸載都是一個Hack的技術,之前的NetFx都是使用AppDomain的方式去加載程序集,然而AppDomain并沒有提供直接卸載一個程序集的API,而是要卸載整個AppDomain才能卸載包含在其中的所有程序集。然而卸載整個CurrentAppDomain會使程序不能工作??赡苡腥肆肀傥鹘洠瑒?chuàng)建別一個AppDomain來加載/卸載程序集,但是由于程序集之間是不能跨域訪問的,也導致只能通過Remote Proxy的方式去訪問,這樣在類型創(chuàng)建和使用上帶來了一定的難度也是類型的繼承變得相當復雜。
.NET Core中一直沒有AppDomain的支持。但是在.NET Core 3.0中,我最期待的一個特性就是對可收集程序集的支持(Collectible AssemblyLoadContext)。 眾所周知.NET Core中一直使用AssemblyLoadContext的API,來進行程序集的動態(tài)加載,但是并沒有提供Unload的方法,此次升級更新了這方面的能力。
二、AssemblyLoadContext
其實這次AssemblyLoadContext的設計,我認為更像是Java中ClassLoader的翻版,可以說非常類似。在使用過程中自定義AssemblyLoadContext可以內部管理其中的程序集,并對整體Context進行Unload。使用AssemblyLoadContext也可以避免程序集名稱和版本的沖突。
三、Getting Started
.NET Core 3.0還沒有正式版,所有要使用預覽版的SDK完成以下實例。我使用的是.NET Core SDK 3.0.100-preview-009812
dotnet new globaljson --sdk-version 3.0.100-preview-009812
AssemblyLoadContext是一個抽象類的,我們需要子類化。下面顯示的是我們創(chuàng)建自定義AssemblyLoadContext的方法,實現(xiàn)一個可回收的Context需要在構造器中指定isCollectible: true :
public class CollectibleAssemblyLoadContext : AssemblyLoadContext { public CollectibleAssemblyLoadContext() : base(isCollectible: true) { } protected override Assembly Load(AssemblyName assemblyName) { return null; } }
使用netstandard2.0創(chuàng)建一個library
using System; namespace SampleLibrary { public class SayHello { public void Hello(int iteration) { Console.WriteLine($"Hello {iteration}!"); } } }
測試Load/Unload
var context = new CollectibleAssemblyLoadContext(); var assemblyPath = Path.Combine(Directory.GetCurrentDirectory(),"SampleLibrary.dll"); using (var fs = new FileStream(assemblyPath, FileMode.Open, FileAccess.Read)) { var assembly = context.LoadFromStream(fs); var type = assembly.GetType("SampleLibrary.SayHello"); var greetMethod = type.GetMethod("Hello"); var instance = Activator.CreateInstance(type); greetMethod.Invoke(instance, new object[] { i }); } context.Unload(); GC.Collect(); GC.WaitForPendingFinalizers();
當執(zhí)行GC收回后,加載的程序集會被完全的回收。
四、最后
GitHub:https://github.com/maxzhang1985/YOYOFx 如果覺還可以請Star下, 歡迎一起交流。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持我們。
欄 目:ASP.NET
本文標題:.NET Core 3.0 可回收程序集加載上下文的實現(xiàn)
本文地址:http://mengdiqiu.com.cn/a1/ASP_NET/10918.html
您可能感興趣的文章
- 01-11如何給asp.net core寫個簡單的健康檢查
- 01-11淺析.Net Core中Json配置的自動更新
- 01-11.net core高吞吐遠程方法如何調用組件XRPC詳解
- 01-11.NET Core 遷移躺坑記續(xù)集之Win下莫名其妙的超時
- 01-11.NET開發(fā)人員關于ML.NET的入門學習
- 01-11docker部署Asp.net core應用的完整步驟
- 01-11.net core webapi jwt 更為清爽的認證詳解
- 01-11ASP.NET Core靜態(tài)文件的使用方法
- 01-11.NET Core 3.0之創(chuàng)建基于Consul的Configuration擴展組件
- 01-11.net core EF Core調用存儲過程的方式


閱讀排行
本欄相關
- 01-11vscode extension插件開發(fā)詳解
- 01-11VsCode插件開發(fā)之插件初步通信的方法
- 01-11如何給asp.net core寫個簡單的健康檢查
- 01-11.net core高吞吐遠程方法如何調用組件
- 01-11淺析.Net Core中Json配置的自動更新
- 01-11.NET開發(fā)人員關于ML.NET的入門學習
- 01-11.NET Core 遷移躺坑記續(xù)集之Win下莫名其
- 01-11.net core webapi jwt 更為清爽的認證詳解
- 01-11docker部署Asp.net core應用的完整步驟
- 01-11ASP.NET Core靜態(tài)文件的使用方法
隨機閱讀
- 04-02jquery與jsp,用jquery
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10C#中split用法實例總結
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10delphi制作wav文件的方法
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05織夢dedecms什么時候用欄目交叉功能?