.NetCore 与 .NetFramework 动态加载DLL的一些不同点

在.NetCore实现插件系统的时候,发现某些方法与在.NetFramework内的使用方法不一样,在此做一个记录供以后查阅。

NO.1 Assembly.LoadAssemblyLoadContext.Default.LoadFromXXX

在.NetFramework当中,如果要加载某一个程序集的话,通过Assembly的Load的各种重载方法即可通过文件流、文件路
径等方式将其加载到当前调用方的应用程序域当中。但是在.Net Core当中则不然,它并没有在Assembly当中提供Load
方法供开发人员操作,而你则需要在Nuget里面对当前项目安装System.Runtime.Loader,然后使用其提供的
AssemblyLoadContext来进行程序集加载。

引用自OSChina的一篇资讯

App Domain

App Domain在CoreCLR中得以实现,但没有在.NET Native中实现。由于对App Domain的实现需要大量的运行时特性支持,因此目前还没有任何对它的支持计划。“对于代码的隔离,我们建议通过进程或容器实现。而对于程序集的动态加 载,我们建议使用新的AssemblyLoadContext类。”

例如以下代码:

// .NetFramework
public void assemblyTestMethod()
{
  var _asm = Assembly.Load("C:\Test.dll");
}
// .Net Core
public void assemblyTestMethodCore()
{
    var _asm = AssemblyLoadContext.Default.LoadFromAssemblyPath("C:\Test.dll");
}

NO.2 GetCustomAttribute() 扩展支持

在.NetFramework当中,GetCustomAttribute()方法是针对Type与TypeInfo对象的,但是在.NetCore当中如果要调用这个
方法的话,则仅能通过Type.GetTypeInfo().GetCustomAttribute()来获得对象的特性标签。

NO.3 GetInterface与GetInterfaces方法

貌似在.NetCore当中的Type对象是没有Getinterface方法的,So...你只有使用后者获得一个IEnumerable对象再来筛选啦。