MarshalByRefObject est-il spécial?

.NET a une chose appelée remoting où vous pouvez passer des objects entre des domaines d’applications distincts ou même des machines physiques. Je ne comprends pas bien comment la magie est faite, d’où cette question.

En remoting, il existe deux méthodes de base pour transmettre des objects: ils peuvent être sérialisés (convertis en un nombre d’octets et la reconstruction à l’autre extrémité) ou hériter de MarshalByRefObject , auquel cas .NET crée des proxys transparents et tous les appels de méthode sont renvoyés à l’instance d’origine.

C’est plutôt cool et fonctionne comme de la magie. Et je n’aime pas la magie dans la programmation. En regardant le MarshalByRefObject avec le réflecteur, je ne vois rien qui le distingue des autres objects typiques. Pas même un atsortingbut interne étrange ou quoi que ce soit. Alors, comment tout le proxy transparent est-il organisé? Puis-je faire un tel mécanisme moi-même? Puis-je créer un autre object MyMarshalByRefObject qui n’hériterait pas de MarshalByRefObject mais MarshalByRefObject quand même de la même manière? Ou est-ce que MarshalByRefObject reçoit un traitement spécial de la part du moteur .NET lui-même et que tout l’exploit à distance n’est pas duplicable par de simples mortels?

    La magie semble être dans une classe spéciale TransparentProxy – le runtime .NET le gère de manière spéciale.

    • Si vous voulez l’utiliser, consultez un article sur RealProxy [lien semble maintenant cassé 🙁 2011-10-14] .
    • Si vous voulez en savoir plus sur la “magie”, consultez un article sur l’implémentation de TransparentProxy .
    • Pour un aperçu de base, essayez l’article MSDN “Remoting: A Technical Overview” .

    Je pense que MarshalByRefObject peut contenir des informations internes supplémentaires qui peuvent être utiles pour ce mécanisme, mais je n’ai pas beaucoup réfléchi à cela.

    Je pense que MarshalByRefObject n’est pas si spécial. Je crois que toute sa raison d’être réside dans sa gestion de durée de vie et la façon dont elle est collectée sur le serveur. Il y a quelques bons commentaires sur ce dont il s’agit dans la documentation de la classe LifetimeServices .

    AFAIK, la véritable magie de la communication à distance est assurée par l’infrastructure distante lorsque vous configurez les hôtes. MarshalByRefObject ne fait rien du vrai travail de rassemblement de choses sur AppDomains.