?using System;  
using System.Collections.Generic;
using System.Text;
using System.Runtime.Remoting;
using System.Reflection;
using Artech.AppDomainIsolation;

namespace Artech.AppDomainIsolation
{
public class GeneralType
{
AppDomain GetAppDomain()
{
return AppDomain.CurrentDomain;
}
}

[Serializable]
public class MarshalByValueType
{
public AppDomain GetAppDomain()
{
return AppDomain.CurrentDomain;
}
}

public class MarshalByRefType : MarshalByRefObject
{
public AppDomain GetAppDomain()
{
return AppDomain.CurrentDomain;
}
}
class Program
{

static void Main(string[] args)
{
AppDomain appDomain = AppDomain.CreateDomain("newAppDomain");

string assemblyName = "Artech.AppDomainIsolation";
try
{
GeneralType generalObject = (GeneralType)appDomain.CreateInstanceAndUnwrap(assemblyName, "Artech.AppDomainIsolation.GeneralType");
}
catch (Exception ex)
{
Console.WriteLine("Fail to pass a general type instance created in another application domain to default appliction domain,beacuse \"{0}\"", ex.Message);
}

MarshalByValueType marshalByValueObject = (MarshalByValueType)appDomain.CreateInstanceAndUnwrap(assemblyName, "Artech.AppDomainIsolation.MarshalByValueType");
MarshalByRefType marshalByRefObject = (MarshalByRefType)appDomain.CreateInstanceAndUnwrap(assemblyName, "Artech.AppDomainIsolation.MarshalByRefType");

Console.WriteLine("\nmarshalByValueObject is a transparent proxy? {0}.",RemotingServices.IsTransparentProxy(marshalByValueObject)?"Yes":"No");
Console.WriteLine("marshalByRefObject is a transparent proxy? {0}.", RemotingServices.IsTransparentProxy(marshalByRefObject) ? "Yes" : "No");

AppDomain appDomain_MarshalByValueType = marshalByValueObject.GetAppDomain();
AppDomain appDomain_MarshalByRefType = marshalByRefObject.GetAppDomain();

Console.WriteLine("\nThe method of marshalByValueObject is executed in the default application domain?\"{0}\"",
object.ReferenceEquals(AppDomain.CurrentDomain, appDomain_MarshalByValueType) ? "Yes" : "No");
Console.WriteLine("The method of marshalByRefObject is executed in the default application domain?\"{0}\"",
object.ReferenceEquals(AppDomain.CurrentDomain, appDomain_MarshalByRefType) ? "Yes" : "No");

AppDomain.Unload(appDomain_MarshalByRefType);
marshalByValueObject.GetAppDomain();

try
{
marshalByRefObject.GetAppDomain();
}
catch (Exception ex)
{
Console.WriteLine("\nAn exception is thorwn when calling the method of marshalByRefObject because \"{0}\"", ex.Message);
}
Console.Read();
}
}
}