.NET hat etwas namens Remoting, bei dem Sie Objekte zwischen separaten App-Domains oder sogar physischen Maschinen weitergeben können. Ich verstehe nicht ganz, wie die Magie gemacht wird, daher diese Frage.Ist MarshalByRefObject speziell?
Im Remoting gibt es zwei grundlegende Möglichkeiten, Objekte zu übergeben - entweder können sie serialisiert werden (konvertiert in eine Menge von Bytes und am anderen Ende wieder aufgebaut) oder sie können von MarshalByRefObject erben. In diesem Fall macht .NET einige Transparente Proxys und alle Methodenaufrufe werden an die ursprüngliche Instanz weitergeleitet.
Das ist ziemlich cool und funktioniert wie Magie. Und ich mag keine Magie beim Programmieren. Betrachtet man die MarshalByRefObject
mit dem Reflektor, sehe ich nichts, was sie von anderen typischen Objekten unterscheidet. Nicht einmal ein seltsames inneres Attribut oder so. Wie ist also die ganze transparente Proxy-Sache organisiert? Kann ich einen solchen Mechanismus selbst machen? Kann ich eine Alternative MyMarshalByRefObject
machen, die nicht von MarshalByRefObject
erben würde, aber immer noch dasselbe tun würde? Oder ist MarshalByRefObject
eine spezielle Behandlung durch die .NET-Engine selbst erhalten und die gesamte Remoting-Leistung ist nicht kopierbar durch Normalsterbliche?
Wenn .NET Remoting alle Klassen behandelt, die von MarshalByRefObject in einer besonderen Weise erben, qualifiziert sich das für "MarshalByRefObject ist speziell"? Verwenden Sie den Reflektor auf .NET Remoting und finden Sie die Magie. BTW, .NET Remoting ist veraltet, zusammen mit MarshalByRefObject. Es kann natürlich verwendet werden, aber WCF ist die derzeit vorherrschende "Remoting-Architektur" in .NET. –
WCF unterstützt weiterhin MarshalByRefObject – Schneider
Die Magie liegt im Jitter, es behandelt MBRO-Klassen besonders. Es greift nicht mehr direkt auf Felder in einer Klasse zu, sondern generiert stattdessen Code, um stattdessen eine CLR-Hilfsmethode zu verwenden. Das ist bewusst, dass das Objekt remote ist, weiß also, wann ein Proxy-Aufruf generiert werden soll. –