真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

.NETCore3.0如何實現(xiàn)可回收程序集加載上下文-創(chuàng)新互聯(lián)

小編給大家分享一下.NET Core 3.0如何實現(xiàn)可回收程序集加載上下文,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

創(chuàng)新互聯(lián)公司長期為上千客戶提供的網(wǎng)站建設服務,團隊從業(yè)經(jīng)驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為高邑企業(yè)提供專業(yè)的做網(wǎng)站、成都網(wǎng)站建設,高邑網(wǎng)站改版等技術服務。擁有十載豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。

一、前世今生

.NET誕生以來,程序集的動態(tài)加載和卸載都是一個Hack的技術,之前的NetFx都是使用AppDomain的方式去加載程序集,然而AppDomain并沒有提供直接卸載一個程序集的API,而是要卸載整個AppDomain才能卸載包含在其中的所有程序集。然而卸載整個CurrentAppDomain會使程序不能工作??赡苡腥肆肀傥鹘?jīng),創(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可以內(nèi)部管理其中的程序集,并對整體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收回后,加載的程序集會被完全的回收。

看完了這篇文章,相信你對“.NET Core 3.0如何實現(xiàn)可回收程序集加載上下文”有了一定的了解,如果想了解更多相關知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!


當前名稱:.NETCore3.0如何實現(xiàn)可回收程序集加載上下文-創(chuàng)新互聯(lián)
網(wǎng)頁URL:http://weahome.cn/article/dccigd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部