您不再需要AppDomain,现在有了LoadContexts:
public class CollectibleAssemblyLoadContext
: AssemblyLoadContext
{
public CollectibleAssemblyLoadContext() : base(isCollectible: true)
{ }
protected override Assembly Load(AssemblyName assemblyName)
{
return null;
}
}
byte[] result = null;
System.Runtime.Loader.AssemblyLoadContext context = new CollectibleAssemblyLoadContext();
System.IO.Stream ms = new System.IO.MemoryStream(result);
System.Reflection.Assembly assembly = context.LoadFromStream(ms);
System.Type programType = assembly.GetType("RsEval");
MyAbstractClass eval = (MyAbstractClass )System.Activator.CreateInstance(programType);
eval.LoadContext = context;
eval.Stream = ms;
然后你可以说
eval.LoadContext.Unload();
eval.Stream.Dispose();
如果将其放入抽象类的IDisposable接口中,则有好处,如果需要,可以使用using。
注意:
这假定在公共程序集中有一个固定的抽象类
public abstract class MyAbstractClass
{
public virtual void foo()
{}
}
以及一个动态的运行时生成的类(使用Roslyn),该类引用公共程序集中的抽象类,该类实现例如:
public class RsEval: MyAbstractClass
{
public override void foo()
{}
}