.NETCore3.0可回收程序集加載上下文怎么實(shí)現(xiàn)

這篇文章主要講解了“.NET Core 3.0可回收程序集加載上下文怎么實(shí)現(xiàn)”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“.NET Core 3.0可回收程序集加載上下文怎么實(shí)現(xiàn)”吧!

創(chuàng)新互聯(lián)公司專注于西充網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供西充營銷型網(wǎng)站建設(shè),西充網(wǎng)站制作、西充網(wǎng)頁設(shè)計(jì)、西充網(wǎng)站官網(wǎng)定制、微信小程序開發(fā)服務(wù),打造西充網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供西充網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

一、前世今生

.NET誕生以來,程序集的動(dòng)態(tài)加載和卸載都是一個(gè)Hack的技術(shù),之前的NetFx都是使用AppDomain的方式去加載程序集,然而AppDomain并沒有提供直接卸載一個(gè)程序集的API,而是要卸載整個(gè)AppDomain才能卸載包含在其中的所有程序集。然而卸載整個(gè)CurrentAppDomain會(huì)使程序不能工作??赡苡腥肆肀傥鹘?jīng),創(chuàng)建別一個(gè)AppDomain來加載/卸載程序集,但是由于程序集之間是不能跨域訪問的,也導(dǎo)致只能通過Remote Proxy的方式去訪問,這樣在類型創(chuàng)建和使用上帶來了一定的難度也是類型的繼承變得相當(dāng)復(fù)雜。

.NET Core中一直沒有AppDomain的支持。但是在.NET Core 3.0中,我最期待的一個(gè)特性就是對(duì)可收集程序集的支持(Collectible AssemblyLoadContext)。眾所周知.NET Core中一直使用AssemblyLoadContext的API,來進(jìn)行程序集的動(dòng)態(tài)加載,但是并沒有提供Unload的方法,此次升級(jí)更新了這方面的能力。

二、AssemblyLoadContext

其實(shí)這次AssemblyLoadContext的設(shè)計(jì),我認(rèn)為更像是Java中ClassLoader的翻版,可以說非常類似。在使用過程中自定義AssemblyLoadContext可以內(nèi)部管理其中的程序集,并對(duì)整體Context進(jìn)行Unload。使用AssemblyLoadContext也可以避免程序集名稱和版本的沖突。

三、Getting Started

.NET Core 3.0還沒有正式版,所有要使用預(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}!");        }    }}

測試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ì)被完全的回收。

感謝各位的閱讀,以上就是“.NET Core 3.0可回收程序集加載上下文怎么實(shí)現(xiàn)”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì).NET Core 3.0可回收程序集加載上下文怎么實(shí)現(xiàn)這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

網(wǎng)站標(biāo)題:.NETCore3.0可回收程序集加載上下文怎么實(shí)現(xiàn)
URL地址:http://muchs.cn/article34/pishse.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、做網(wǎng)站、網(wǎng)站內(nèi)鏈、網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、網(wǎng)站營銷

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)