国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

.NET Core 3.0 可回收程序集加載上下文的實現

來源:懂視網 責編:小采 時間:2020-11-27 22:34:27
文檔

.NET Core 3.0 可回收程序集加載上下文的實現

.NET Core 3.0 可回收程序集加載上下文的實現:一、前世今生 .NET誕生以來,程序集的動態加載和卸載都是一個Hack的技術,之前的NetFx都是使用AppDomain的方式去加載程序集,然而AppDomain并沒有提供直接卸載一個程序集的API,而是要卸載整個AppDomain才能卸載包含在其中的所有程序集。然而卸載整個Curr
推薦度:
導讀.NET Core 3.0 可回收程序集加載上下文的實現:一、前世今生 .NET誕生以來,程序集的動態加載和卸載都是一個Hack的技術,之前的NetFx都是使用AppDomain的方式去加載程序集,然而AppDomain并沒有提供直接卸載一個程序集的API,而是要卸載整個AppDomain才能卸載包含在其中的所有程序集。然而卸載整個Curr

一、前世今生

.NET誕生以來,程序集的動態加載和卸載都是一個Hack的技術,之前的NetFx都是使用AppDomain的方式去加載程序集,然而AppDomain并沒有提供直接卸載一個程序集的API,而是要卸載整個AppDomain才能卸載包含在其中的所有程序集。然而卸載整個CurrentAppDomain會使程序不能工作。可能有人另辟西經,創建別一個AppDomain來加載/卸載程序集,但是由于程序集之間是不能跨域訪問的,也導致只能通過Remote Proxy的方式去訪問,這樣在類型創建和使用上帶來了一定的難度也是類型的繼承變得相當復雜。

.NET Core中一直沒有AppDomain的支持。但是在.NET Core 3.0中,我最期待的一個特性就是對可收集程序集的支持(Collectible AssemblyLoadContext)。 眾所周知.NET Core中一直使用AssemblyLoadContext的API,來進行程序集的動態加載,但是并沒有提供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是一個抽象類的,我們需要子類化。下面顯示的是我們創建自定義AssemblyLoadContext的方法,實現一個可回收的Context需要在構造器中指定isCollectible: true :

public class CollectibleAssemblyLoadContext : AssemblyLoadContext
{
 public CollectibleAssemblyLoadContext() : base(isCollectible: true)
 { }
 
 protected override Assembly Load(AssemblyName assemblyName)
 {
 return null;
 }
}

使用netstandard2.0創建一個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();

當執行GC收回后,加載的程序集會被完全的回收。

四、最后

GitHub:https://github.com/maxzhang1985/YOYOFx 如果覺還可以請Star下, 歡迎一起交流。

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

.NET Core 3.0 可回收程序集加載上下文的實現

.NET Core 3.0 可回收程序集加載上下文的實現:一、前世今生 .NET誕生以來,程序集的動態加載和卸載都是一個Hack的技術,之前的NetFx都是使用AppDomain的方式去加載程序集,然而AppDomain并沒有提供直接卸載一個程序集的API,而是要卸載整個AppDomain才能卸載包含在其中的所有程序集。然而卸載整個Curr
推薦度:
標簽: 加載 實現 net
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 国内精品久久久久久久aa护士 | 欧美在线精品一区二区三区 | 91久久精品国产免费一区 | 五十路在线播放 | 免费观看亚洲视频 | 最新中文字幕第一页 | 国产大片91精品免费观看不卡 | 欧美激情亚洲一区中文字幕 | 国产在线视频在线 | 久久精品国产精品亚洲毛片 | 成人一区在线 | 欧美国产在线视频 | 久久精品国产91久久综合麻豆自制 | 中文字幕日本一本二本三区 | 四虎影在线永久免费观看 | 久久久久久久一精品 | 亚欧美色| 日韩 亚洲 欧美 中文 高清 | 一级毛片在线看在线播放 | 国产亚洲一区二区精品 | 美日韩在线视频 | 人与动交xxx | 欧美网址在线观看 | 日本成人一级 | 亚欧乱亚欧乱色视频免费 | 亚洲欧美日韩在线观看 | 免费看黄色毛片 | 欧美国产综合在线 | 欧美精品在线视频 | 一本久久精品一区二区 | 囗交免费毛片 | 91在线看片 | 亚洲最大色网 | 亚洲综合欧美在线 | 一边摸一边叫床一边爽 | 91精品国产91久久 | 亚洲欧美日韩另类在线专区 | 中文字幕日本一本二本三区 | 欧美在线一区视频 | 国产精品伦视频观看免费 | 久久国内精品 |