定义一个类库,定义接口
namespace Plugin
{
public interface IPlugin
{
void EllisTest ( ) ;
}
}
定义另外一个类库,引用上面的类库,实现接口
using Plugin ;
namespace UserCustom
{
public class Custom : IPlugin
{
public void EllisTest ( )
{
Console. WriteLine ( "哈哈,今天这个天气挺好的" ) ;
}
}
}
定义API,使用assemble加载dll
[ HttpGet ( Name = "test" ) ]
public IActionResult DirectLoad ( )
{
Assembly assembly = Assembly. LoadFrom ( "C:\\Users\\84977\\Desktop\\UserCustom.dll" ) ;
var pluginType = assembly. GetTypes ( ) . FirstOrDefault ( t => typeof ( IPlugin ) . IsAssignableFrom ( t) && ! t. IsInterface && ! t. IsAbstract) ;
if ( pluginType != null )
{
IPlugin plugin = ( IPlugin) Activator. CreateInstance ( pluginType) ;
plugin. EllisTest ( ) ;
}
return Ok ( ) ;
}
[ HttpGet ( Name = "GetWeatherForecast" ) ]
public IEnumerable< WeatherForecast> Get ( )
{
string pluginPath = "C:\\Users\\84977\\Desktop\\UserCustom.dll" ;
var pluginLoader = new PluginLoader ( ) ;
pluginLoader. LoadAndExecutePlugin ( pluginPath) ;
return Enumerable. Range ( 1 , 5 ) . Select ( index => new WeatherForecast
{
Date = DateTime. Now. AddDays ( index) ,
TemperatureC = Random. Shared. Next ( - 20 , 55 ) ,
Summary = Summaries[ Random. Shared. Next ( Summaries. Length) ]
} )
. ToArray ( ) ;
}
使用AssemblyLoadContext 加载dll
public class CustomAssemblyLoadContext : AssemblyLoadContext
{
public CustomAssemblyLoadContext ( ) : base ( isCollectible : true )
{
}
protected override Assembly Load ( AssemblyName assemblyName)
{
return null ;
}
}
public class PluginLoader
{
public void LoadAndExecutePlugin ( string pluginPath)
{
var context = new CustomAssemblyLoadContext ( ) ;
var assembly = context. LoadFromAssemblyPath ( pluginPath) ;
var pluginType = assembly. GetTypes ( ) . FirstOrDefault ( t => typeof ( IPlugin ) . IsAssignableFrom ( t) && ! t. IsInterface && ! t. IsAbstract) ;
if ( pluginType != null )
{
var plugin = ( IPlugin) Activator. CreateInstance ( pluginType) ;
plugin. EllisTest ( ) ;
}
assembly = null ;
GC. Collect ( ) ;
GC. WaitForPendingFinalizers ( ) ;
context. Unload ( ) ;
}
}