// ===++===
//
// 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
{
///<summary>
/// Clase pasada por referencia (hereda de MarshalByRefObject).
///</summary>
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();
}
}
///<summary>
/// Clase de uso de ObjectHandle
///</summary>
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();
}
}
}