Creating an appdomain

A simple example of creating and destroying an AppDomain on .NET, and running code inside the app domain. Generally used to load plugins or other code that should allow for dlls to be unloaded after use.

  RemoteAppDomain = public class(IDisposable)
  public
    constructor;
    method Dispose;

    property Domain: AppDomain; readonly;
    property RemoteHelper: RemoteHelper; readonly;
  end;

  RemoteHelper = public class(MarshalByRefObject, IDisposable)
  private
  public
    method Run;

    method Dispose;
  end;

implementation

method RemoteHelper.Run;
begin
  writeLn('From app domain!');
end;

method RemoteHelper.Dispose;
begin
  writeLn('Cleanup');
end;


constructor RemoteAppDomain;
begin
  var t := typeOf(RemoteHelper);
  var lDomainSetup := new AppDomainSetup(ApplicationBase := Path.GetDirectoryName(t.Assembly.Location));
  Domain := AppDomain.CreateDomain('RemoteDomain', nil, lDomainSetup);

  RemoteHelper := RemoteHelper(Domain.CreateInstanceAndUnwrap(t.Assembly.FullName, t.FullName, false, BindingFlags.Default, nil, new System.Object[0], nil, nil));
end;

method RemoteAppDomain.Dispose;
begin
  RemoteHelper.Dispose;
  AppDomain.Unload(Domain);
end;

This can then be used with:

  using dom := new RemoteAppDomain do
    dom.RemoteHelper.Run;