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