¿MarshalByRefObject es especial?


. NET tiene una cosa llamada remoting donde puede pasar objetos entre appdomains separados o incluso máquinas físicas. No entiendo completamente cómo se hace la magia, de ahí esta pregunta.

En la comunicación remota hay dos formas básicas de pasar objetos - o bien pueden ser serializados (convertidos a un montón de bytes y reconstruidos en el otro extremo) o pueden heredar de MarshalByRefObject , en cuyo caso. NET hace algunos proxies transparentes y todas las llamadas a métodos se reenvían a la instancia original.

Esto es bastante genial y funciona como magia. Y no me gusta la magia en la programación. Mirando el MarshalByRefObject con el Reflector no veo nada que lo distinguen de cualquier otro típico objeto. Ni siquiera un extraño atributo interno o algo así. Entonces, ¿cómo está organizado todo el asunto del proxy transparente? ¿Puedo hacer tal mecanismo yo mismo? ¿Puedo hacer un MyMarshalByRefObject alternativo que no heredaría de MarshalByRefObject pero seguiría actuando igual? O es MarshalByRefObject recibir algún tratamiento especial por el motor. NET en sí y toda la hazaña remota no es duplicable por meros mortales?

Author: Jonathan Leffler, 2010-04-27

2 answers

La magia parece estar en una clase especial TransparentProxy - el tiempo de ejecución de.NET lo maneja de una manera especial.

Creo que MarshalByRefObject puede contener alguna información interna adicional que puede ser útil para este mecanismo, pero no he mirado mucho en eso.

 17
Author: akavel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-14 12:41:31

Creo que MarshalByRefObject no es tan especial. Creo que toda su razón de existencia radica en su administración de por vida y en cómo se recolecta 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 realiza la propia infraestructura de comunicación remota cuando configura los hosts. MarshalByRefObject no está haciendo nada del trabajo real de ordenar cosas a través de AppDomains.

 4
Author: Dave Markle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-18 21:19:58