48 votes

Est-ce que MarshalByRefObject est spécial ?

.NET a une chose appelée le remoting où vous pouvez passer des objets entre des domaines d'applications séparés ou même entre des machines physiques. Je ne comprends pas entièrement comment la magie opère, d'où cette question.

Dans le remoting, il existe deux façons principales de passer des objets - soit ils peuvent être sérialisés (convertis en une série d'octets puis reconstruits à l'autre extrémité) soit ils peuvent hériter de MarshalByRefObject, auquel cas .NET crée des proxies transparents et toutes les appels de méthodes sont renvoyés à l'instance d'origine.

C'est plutôt cool et cela fonctionne comme par magie. Et je n'aime pas la magie en programmation. En regardant le MarshalByRefObject avec Reflector, je ne vois rien qui le distingue d'un objet typique. Même pas un attribut interne étrange ou quoi que ce soit. Alors comment tout le système de proxy transparent est-il organisé ? Puis-je créer un tel mécanisme moi-même ? Puis-je créer une alternative MyMarshalByRefObject qui n'hériterait pas de MarshalByRefObject mais agirait tout de même de la même manière ? Ou bien MarshalByRefObject reçoit-il un traitement spécial de la part du moteur .NET lui-même et tout l'exploit du remoting est-il non duplicable par de simples mortels ?

1 votes

Si .NET Remoting traite toutes les classes qui héritent de MarshalByRefObject de manière spéciale, cela qualifie-t-il "MarshalByRefObject est spécial"? Utilisez Reflector sur .NET Remoting et trouvez la magie. Au fait, .NET Remoting est obsolète, tout comme MarshalByRefObject. Il peut bien sûr être utilisé, mais WCF est actuellement l'architecture de "remoting" prédominante dans .NET.

1 votes

WCF prend toujours en charge MarshalByRefObject

8 votes

La magie réside dans le jitter, il traite les classes MBRO de manière spéciale. Il n'accède plus directement aux champs d'une classe, mais génère du code pour utiliser une méthode d'aide CLR à la place. Ce qui sait que l'objet est distant et sait quand générer un appel de proxy.

20voto

akavel Points 1620

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

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 creusé cela.

0 votes

Article à propos de RealProxy est cassé (ou du moins privé)

1 votes

Merci pour l'info, ça semble être le cas pour moi aussi :-( Malheureusement, je ne le trouve pas non plus sur web.archive.org. Peut-être qu'essayer de contacter l'auteur @thomas-danecker personnellement pourrait aider d'une manière ou d'une autre

1 votes

Juste pour être clair, MarshalByRefObject et les classes dérivées de celui-ci SONT spéciales, de la même manière que les ValueTypes sont spéciales : le JIT change une partie de sa génération de code lorsque l'on traite un MarshalByRefObject, et désactive certaines optimisations. Lorsque vous avez une référence à un objet 'x' qui dérive de MarshalByRefObject, le JIT doit toujours considérer la possibilité que x soit un TransparentProxy vers un objet distant. Par exemple, l'optimisation de l'inlining pourrait être désactivée, ou être conditionnée par une vérification pour tester d'abord si 'x' est local ou distant.

4voto

Dave Markle Points 44637

Je pense que MarshalByRefObject n'est pas si spécial. Je crois que sa raison d'être réside entièrement dans sa gestion de durée de vie et dans la façon dont il est ramassé par le garbage collector sur le serveur. Il y a de bons commentaires sur ce sujet dans la documentation de la classe LifetimeServices.

À ma connaissance, la vraie magie de la communication à distance est réalisée par l'infrastructure de communication elle-même lorsque vous configurez les hôtes. MarshalByRefObject ne fait aucun travail réel de mise en adéquation des éléments à travers les domaines d'application.

1 votes

Dans mon cas, je n'ai besoin que de communiquer à travers les limites des domaines d'applications (et cela uniquement parce que je dois décharger une DLL gérée). Cela rend le Remoting attrayant car c'est tellement simple à utiliser.

0 votes

D'accord, de toute façon, si MarshalByRefObject n'est pas clé pour tout le processus, qu'est-ce qui l'est? Qu'est-ce qui crée exactement les proxies mystiques, etc.?

0 votes

Jetez un œil à RemotingConfiguration.RegisterWellKnownServiceType(). J'ai dû chercher car j'avais oublié tout ce qui concernait le Remoting car je suis passé à WCF il y a 2 ans. WCF peut faire tout ce que vous voulez. Vous trouverez aussi plus de ressources pour cela. J'ai l'impression de l'ancien homme chinois dans "Gremlins" qui met en garde l'enfant concernant sa décision, mais l'enfant décide quand même de nourrir la chose...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X