?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(); } } } |