using System;
using System.Threading ;
using System.Threading .Tasks ;
class Program
{
static void Main( string[ ] args)
{
var newDomain = AppDomain.CreateDomain ( "Worker domain" ) ;
newDomain.DomainUnload += ( o, e) =>
Console.WriteLine ( $"App domain unload event in thread {Thread.CurrentThread.ManagedThreadId}, domain {AppDomain.CurrentDomain.FriendlyName}, at {DateTime.Now}" ) ;
Task.Run ( ( ) =>
{
Thread.Sleep ( 1000 ) ;
Console.WriteLine ( $"App domain killer in thread {Thread.CurrentThread.ManagedThreadId}, domain {AppDomain.CurrentDomain.FriendlyName}, at {DateTime.Now}" ) ;
AppDomain.Unload ( newDomain) ;
} ) ;
Worker remoteWorker = ( Worker) newDomain.CreateInstanceAndUnwrap (
typeof( Worker) .Assembly .FullName , typeof( Worker) .FullName ) ;
var result = remoteWorker.Work ( ) ;
Console.WriteLine ( result) ;
}
}
class Worker : MarshalByRefObject
{
public int Work( )
{
int result = 0 ;
try
{
// nothing
}
finally
{
Console.WriteLine ( $"Worker.Work in thread {Thread.CurrentThread.ManagedThreadId}, domain {AppDomain.CurrentDomain.FriendlyName}, at {DateTime.Now}" ) ;
for ( int i = 0 ; i < 4 ; i++ )
{
result += 1 ;
Thread.Sleep ( 1000 ) ;
Console.WriteLine ( $"Worker.Work in thread {Thread.CurrentThread.ManagedThreadId}, domain {AppDomain.CurrentDomain.FriendlyName}, at {DateTime.Now}" ) ;
}
}
return result;
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwoKY2xhc3MgUHJvZ3JhbQp7CiAgICBzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpCiAgICB7CiAgICAgICAgdmFyIG5ld0RvbWFpbiA9IEFwcERvbWFpbi5DcmVhdGVEb21haW4oIldvcmtlciBkb21haW4iKTsKICAgICAgICBuZXdEb21haW4uRG9tYWluVW5sb2FkICs9IChvLCBlKSA9PgogICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgkIkFwcCBkb21haW4gdW5sb2FkIGV2ZW50IGluIHRocmVhZCB7VGhyZWFkLkN1cnJlbnRUaHJlYWQuTWFuYWdlZFRocmVhZElkfSwgZG9tYWluIHtBcHBEb21haW4uQ3VycmVudERvbWFpbi5GcmllbmRseU5hbWV9LCBhdCB7RGF0ZVRpbWUuTm93fSIpOwoKICAgICAgICBUYXNrLlJ1bigoKSA9PgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBUaHJlYWQuU2xlZXAoMTAwMCk7CiAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgkIkFwcCBkb21haW4ga2lsbGVyIGluIHRocmVhZCB7VGhyZWFkLkN1cnJlbnRUaHJlYWQuTWFuYWdlZFRocmVhZElkfSwgZG9tYWluIHtBcHBEb21haW4uQ3VycmVudERvbWFpbi5GcmllbmRseU5hbWV9LCBhdCB7RGF0ZVRpbWUuTm93fSIpOwogICAgICAgICAgICAgICAgQXBwRG9tYWluLlVubG9hZChuZXdEb21haW4pOwogICAgICAgICAgICB9KTsKCiAgICAgICAgV29ya2VyIHJlbW90ZVdvcmtlciA9IChXb3JrZXIpbmV3RG9tYWluLkNyZWF0ZUluc3RhbmNlQW5kVW53cmFwKAogICAgICAgICAgICB0eXBlb2YoV29ya2VyKS5Bc3NlbWJseS5GdWxsTmFtZSwgdHlwZW9mKFdvcmtlcikuRnVsbE5hbWUpOwogICAgICAgIHZhciByZXN1bHQgPSByZW1vdGVXb3JrZXIuV29yaygpOwogICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKHJlc3VsdCk7CiAgICB9Cn0KCmNsYXNzIFdvcmtlciA6IE1hcnNoYWxCeVJlZk9iamVjdAp7CiAgICBwdWJsaWMgaW50IFdvcmsoKQogICAgewogICAgICAgIGludCByZXN1bHQgPSAwOwogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgLy8gbm90aGluZwogICAgICAgIH0KICAgICAgICBmaW5hbGx5CiAgICAgICAgewogICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgkIldvcmtlci5Xb3JrIGluIHRocmVhZCB7VGhyZWFkLkN1cnJlbnRUaHJlYWQuTWFuYWdlZFRocmVhZElkfSwgZG9tYWluIHtBcHBEb21haW4uQ3VycmVudERvbWFpbi5GcmllbmRseU5hbWV9LCBhdCB7RGF0ZVRpbWUuTm93fSIpOwogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0ICs9IDE7CiAgICAgICAgICAgICAgICBUaHJlYWQuU2xlZXAoMTAwMCk7CiAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgkIldvcmtlci5Xb3JrIGluIHRocmVhZCB7VGhyZWFkLkN1cnJlbnRUaHJlYWQuTWFuYWdlZFRocmVhZElkfSwgZG9tYWluIHtBcHBEb21haW4uQ3VycmVudERvbWFpbi5GcmllbmRseU5hbWV9LCBhdCB7RGF0ZVRpbWUuTm93fSIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9Cn0K
stdout
Worker.Work in thread 1, domain Worker domain, at 7/22/2017 11:02:04 AM
App domain killer in thread 4, domain prog.exe, at 7/22/2017 11:02:05 AM
App domain unload event in thread 4, domain Worker domain, at 7/22/2017 11:02:05 AM
Worker.Work in thread 1, domain Worker domain, at 7/22/2017 11:02:05 AM
Worker.Work in thread 1, domain Worker domain, at 7/22/2017 11:02:06 AM
Worker.Work in thread 1, domain Worker domain, at 7/22/2017 11:02:07 AM
Worker.Work in thread 1, domain Worker domain, at 7/22/2017 11:02:08 AM