2010-04-27 14 views
47

.NET tiene una cosa llamada remota donde puedes pasar objetos entre appdomains separados o incluso máquinas físicas. No entiendo completamente cómo se hace la magia, de ahí esta pregunta.¿Es especial MarshalByRefObject?

En la comunicación remota 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 desde MarshalByRefObject, en cuyo caso .NET hace algunos los proxies transparentes y todas 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. Si miro 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 hacer una alternativa MyMarshalByRefObject que no heredaría de MarshalByRefObject pero seguiría actuando de la misma manera? ¿O es que MarshalByRefObject recibe algún tratamiento especial por parte del motor .NET y toda la hazaña remota no es duplicable por simples mortales?

+1

Si .NET Remoting trata a todas las clases que heredan de MarshalByRefObject de una manera especial, ¿eso califica para "MarshalByRefObject es especial"? Usa el reflector en .NET Remoting y encuentra la magia. BTW, .NET Remoting está obsoleto, junto con MarshalByRefObject. Se puede usar, por supuesto, pero WCF es la "arquitectura remota" predominante actualmente en .NET. –

+1

WCF sigue siendo compatible con MarshalByRefObject – Schneider

+7

La magia está en el jitter, trata las clases de MBRO especiales. Ya no accede directamente a los campos de una clase, sino que genera código para usar un método de ayuda de CLR. Que es consciente de que el objeto está en modo remoto, por lo que sabe cuándo generar una llamada proxy. –

Respuesta

17

La magia parece estar en una clase especial TransparentProxy - .NET Runtime 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.

+0

Artículo sobre RealProxy está roto (o al menos * privado *) –

+1

Gracias por la información, también lo veo para mí :-(Desafortunadamente, tampoco lo puedo encontrar en web.archive.org. Tal vez intente contactar al autor @ thomas-danecker personalmente podría ayudar de alguna manera – akavel

+0

Para que quede claro, MarshalByRefObject y las clases derivadas de ARE son especiales, de la misma manera que ValueTypes son especiales: el JIT cambia parte de su generación de código cuando se trata de un MarshalByRefObject, y deshabilita ciertas optimizaciones Cuando tenga una referencia a cualquier objeto 'x' que se derive de MarshalByRefObject, el JIT siempre debe considerar la posibilidad de que x sea un TransparentProxy para un objeto remoto. Por ejemplo, la alineación podría estar deshabilitada o protegida con una verificación para comprobar si 'x' es local o remoto primero. – Qwertie

4

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 realiza usted mismo la infraestructura remota cuando configura los hosts. MarshalByRefObject no está haciendo el trabajo real de ordenar cosas en AppDomains.

+1

En mi caso, solo necesito comunicarme a través de los límites de AppDomain (y eso solo porque necesito descargar un .DLL administrado). Esto hace que Remoting sea atractivo porque es muy fácil de usar. –

+0

OK, de todos modos, si MarshalByRefObject no es clave para todo el proceso, ¿qué es? ¿Qué crea exactamente los proxies místicos, etc.? –

+0

Eche un vistazo a RemotingConfiguration.RegisterWellKnownServiceType().Tuve que buscarlo porque olvidé todo acerca de Remoting porque me cambié a WCF hace 2 años. WCF puede hacer todo lo que quieras. Encontrarás más recursos para eso también. Me siento como el viejo chino de "Gremlins" que advierte al chico sobre su decisión, pero el niño sigue adelante y lo alimenta de todos modos ... –

Cuestiones relacionadas