.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?
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. –
WCF supporta ancora MarshalByRefObject – Schneider
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. –