2010-04-27 13 views
47

.NET ha una funzione chiamata remoting in cui è possibile passare oggetti tra appdomain separati o anche macchine fisiche. Non capisco appieno come sia fatta la magia, quindi questa domanda.MarshalByRefObject è speciale?

In remoto ci sono due modi di base per passare gli oggetti - possono essere serializzati (convertiti in un gruppo di byte e ricostruiti all'altra estremità) oppure possono ereditare da MarshalByRefObject, nel qual caso .NET ne rende alcuni i proxy trasparenti e tutte le chiamate ai metodi vengono reindirizzati all'istanza originale.

Questo è abbastanza bello e funziona come per magia. E non mi piace la magia nella programmazione. Guardando il MarshalByRefObject con il Reflector non vedo nulla che lo distingua da qualsiasi altro oggetto tipico. Neanche un attributo interno strano o altro. Quindi, come è organizzata l'intera cosa proxy trasparente? Posso fare un tale meccanismo da solo? Posso creare un MyMarshalByRefObject alternativo che non erediti da MarshalByRefObject ma agirà sempre allo stesso modo? Oppure è MarshalByRefObject che riceve un trattamento speciale dal motore .NET stesso e l'intera abilità remoting non è duplicabile da semplici mortali?

+1

Se .NET Remoting considera tutte le classi che ereditano da MarshalByRefObject in modo speciale, qualifica per "MarshalByRefObject è speciale"? Usa Reflector su .NET Remoting e trova la magia. BTW, .NET Remoting è obsoleto, insieme a MarshalByRefObject. Può essere usato, naturalmente, ma WCF è attualmente l'"architettura remota" predominante in .NET. –

+1

WCF supporta ancora MarshalByRefObject – Schneider

+7

La magia è nel jitter, tratta le classi MBRO speciali. Non accede più direttamente ai campi di una classe, ma genera codice per utilizzare invece un metodo helper CLR. Che è consapevole del fatto che l'oggetto è remoto e sa quando generare una chiamata proxy. –

risposta

17

La magia sembra essere in una speciale classe TransparentProxy - .NET Runtime lo gestisce in un modo speciale.

Penso che MarshalByRefObject possono contenere alcune informazioni interne supplementare che può essere utile per questo meccanismo, ma non ho guardato molto in questo.

+0

L'articolo su RealProxy è rotto (o almeno * privato *) –

+1

Grazie per le informazioni, sembra così anche per me :-(Purtroppo, non riesco a trovarlo su web.archive.org. Forse provare a contattare l'autore @ thomas-Danecker personalmente potrebbe contribuire in qualche modo – akavel

+0

Giusto per essere chiari, MarshalByRefObject e classi derivate da Is sono speciali, più o meno allo stesso modo in cui ValueTypes sono speciali: il JIT cambia parte della sua generazione di codice quando si tratta di un MarshalByRefObject, e disabilita alcune ottimizzazioni .Quando si ha un riferimento a qualsiasi oggetto 'x' che deriva da MarshalByRefObject, il JIT deve sempre considerare la possibilità che x sia un TransparentProxy su un oggetto remoto. Ad esempio, l'inlining potrebbe essere disabilitato, o protetto con un check per verificare se 'x' è locale o remoto prima. – Qwertie

4

Credo che MarshalByRefObject non sia poi così speciale. Credo che tutta la sua ragione di esistenza risieda nella sua gestione a vita e in che modo viene raccolta sui server. Ci sono alcuni buoni commenti su cosa si tratta nella documentazione della classe LifetimeServices.

AFAIK, la vera magia del remoting viene eseguita dall'infrastruttura remota quando si impostano gli host. MarshalByRefObject non sta facendo nulla del vero lavoro di marshalling su AppDomains.

+1

Nel mio caso ho solo bisogno di comunicare attraverso i confini di AppDomain (e solo perché ho bisogno di scaricare un .DLL gestito). Questo rende il Remoting attraente perché è così semplice da usare. –

+0

OK, comunque, se MarshalByRefObject non è la chiave dell'intero processo, che cos'è? Cosa crea esattamente i proxy mistici, ecc.? –

+0

Dai un'occhiata a RemotingConfiguration.RegisterWellKnownServiceType().Ho dovuto cercare perché ho dimenticato tutto su Remoting perché sono passato a WCF 2 anni fa. WCF può fare tutto ciò che vuoi. Troverete anche più risorse per questo. Mi sento come il vecchio cinese di "Gremlins" che avverte il bambino della sua decisione, ma il bambino va avanti e nutre la cosa comunque ... –