AppDomainsはもう必要ありません。これで、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()
{}
}