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


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-11vscode extension插件開(kāi)發(fā)詳解
- 01-11VsCode插件開(kāi)發(fā)之插件初步通信的方法
- 01-11如何給asp.net core寫(xiě)個(gè)簡(jiǎn)單的健康檢查
- 01-11.net core高吞吐遠(yuǎn)程方法如何調(diào)用組件
- 01-11淺析.Net Core中Json配置的自動(dòng)更新
- 01-11.NET開(kāi)發(fā)人員關(guān)于ML.NET的入門(mén)學(xué)習(xí)
- 01-11.NET Core 遷移躺坑記續(xù)集之Win下莫名其
- 01-11.net core webapi jwt 更為清爽的認(rèn)證詳解
- 01-11docker部署Asp.net core應(yīng)用的完整步驟
- 01-11ASP.NET Core靜態(tài)文件的使用方法
隨機(jī)閱讀
- 04-02jquery與jsp,用jquery
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10C#中split用法實(shí)例總結(jié)
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 01-10delphi制作wav文件的方法
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?


