.net - ¿Es especial MarshalByRefObject?
clr remoting (2)
Creo que MarshalByRefObject no es tan especial. Creo que todo su motivo de existencia radica en su gestión de por vida y en la recolección de basura en el servidor. Hay algunos buenos comentarios sobre de qué se trata esto en la documentación de la clase LifetimeServices .
AFAIK, la verdadera magia de la comunicación remota la lleva a cabo la infraestructura remota cuando configuras los hosts. MarshalByRefObject no está haciendo el trabajo real de ordenar cosas en AppDomains.
.NET tiene una cosa llamada "comunicación remota" en la que puede pasar objetos entre aplicaciones separadas o incluso máquinas físicas. No entiendo completamente cómo se hace la magia, de ahí esta pregunta.
En remoto, hay dos formas básicas de pasar objetos, ya sea que se pueden serializar (convertir a un grupo de bytes y reconstruir en el otro extremo) o pueden heredar de MarshalByRefObject , en cuyo caso .NET realiza algunos proxies transparentes y todo las llamadas a métodos se reenvían a la instancia original.
Esto es genial y funciona como magia. Y no me gusta la magia en la programación. Al mirar el MarshalByRefObject
con el reflector, no veo nada que lo diferencie de cualquier otro objeto típico. Ni siquiera un atributo interno extraño ni nada. Entonces, ¿cómo se organiza todo el proxy transparente? ¿Puedo hacer ese mecanismo yo mismo? ¿Puedo crear un MyMarshalByRefObject
alternativo que no herede de MarshalByRefObject
pero que siga actuando de la misma manera? ¿O es que MarshalByRefObject
recibe algún tratamiento especial por parte del motor .NET y toda la proeza remota no es duplicable por meros mortales?
La magia parece estar en una clase especial TransparentProxy
: .NET Runtime lo maneja de una manera especial.
- Si desea usarlo, consulte un artículo sobre RealProxy [el enlace parece ahora roto :-( 2011-10-14] .
- Si desea leer más sobre la "magia", consulte un artículo sobre la implementación de TransparentProxy .
- Para obtener una descripción general básica, pruebe el artículo de MSDN "Remoting: A Technical Overview" .
Creo que MarshalByRefObject
puede contener información interna adicional que puede ser útil para este mecanismo, pero no he investigado mucho sobre eso.