.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?
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. –
WCF sigue siendo compatible con MarshalByRefObject – Schneider
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. –