// ===++=== // // OrtizOL // // ===--=== /*============================================================ // // Clase: UsoObjectHandle.cs // // Propósito: Demostrar el uso de la clase ObjectHandle del // namespace System.Runtime.Remoting. // ============================================================*/ using System; using System.Reflection; using System.Runtime.Remoting; namespace Recetas.Cap03 { /// /// Clase pasada por referencia (hereda de MarshalByRefObject). /// internal class NuevaClase : MarshalByRefObject { public NuevaClase() { Console.Write("Creación de instancia de `NuevaClase` en el AppDomain: {0}\n", AppDomain.CurrentDomain.GetHashCode()); } public int ObtenerHashCodeDominioActual() { return AppDomain.CurrentDomain.GetHashCode(); } } /// /// Clase de uso de ObjectHandle /// internal class UsoObjectHandle { public static void Main() { // Visualización del hashcode del dominio de aplicación actual: Console.WriteLine("\nHashcode del dominio actual: \n\t{0}\n", AppDomain.CurrentDomain.GetHashCode()); // Creamción de un dominio de aplicación extra: AppDomain nuevoAppDomain = AppDomain.CreateDomain("NuevoDominio"); // Creacion de una instancia de `NuevaClase` en el // AppDomain recién creado: ObjectHandle manejadorObjeto = nuevoAppDomain.CreateInstance(typeof(NuevaClase).Assembly.FullName.ToString(), "Recetas.Cap03.NuevaClase"); // 'Desempaqueta' el objeto cargado en el nuevo dominio `nuevoAppDomain`: NuevaClase pruebaNuevaClase = (NuevaClase)manejadorObjeto.Unwrap(); if(RemotingServices.IsTransparentProxy(pruebaNuevaClase)) { Console.WriteLine("\nEl objeto recuperado con `manejadorObjeto.Unwrap` es un proxy (intermediario)."); } else { Console.WriteLine("\nEl objeto recuperado con `manejadorObjeto.Unwrap` no es un proxy (intermediario)."); } Console.WriteLine(); Console.WriteLine("Invocación al método `pruebaNuevaClase.ObtenerHashCodeDominioActual` en el nuevo dominio: \n\t{0}", pruebaNuevaClase.ObtenerHashCodeDominioActual()); Console.WriteLine(); } } }