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()
     {}
}