2010-04-27 5 views
47

.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?

+1

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. –

+1

WCF unterstützt weiterhin MarshalByRefObject – Schneider

+7

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. –

Antwort

17

Die Magie scheint in einer speziellen TransparentProxy Klasse zu sein - die .NET-Laufzeit behandelt sie auf eine besondere Art und Weise.

ich denke, dass MarshalByRefObject einige zusätzliche interne Informationen enthalten, die für diesen Mechanismus kann hilfreich sein, aber ich habe nicht viel darauf geachtet.

+0

Artikel über RealProxy ist kaputt (oder zumindest * privat *) –

+1

Danke für Info, sieht auch für mich so aus :-(Leider kann ich es auch nicht auf web.archive.org finden. Vielleicht versuchen, den Autor zu kontaktieren @ Thomas-Danecker persönlich könnte irgendwie helfen – akavel

+0

Nur um klar zu sein, MarshalByRefObject und Klassen abgeleitet ist ARE spezielle, in der gleichen Weise, wie ValueTypes sind spezielle: der JIT ändert einige seiner Code-Generierung beim Umgang mit einem MarshalByRefObject, und bestimmte Optimierungen deaktiviert Wenn Sie einen Verweis auf ein Objekt 'x' haben, das von MarshalByRefObject abgeleitet ist, muss das JIT immer die Möglichkeit in Betracht ziehen, dass x ein TransparentProxy für ein entferntes Objekt ist (z. B. Inlining wird deaktiviert oder mit einem Häkchen geschützt, um zu testen, ob) "x" ist lokal oder remote zuerst. – Qwertie

4

Ich glaube, MarshalByRefObject ist nicht so besonders. Ich glaube, dass sein ganzer Existenzgrund mit seinem Lifetime Management zusammenhängt und wie es auf dem Server gesammelt wird. Es gibt einige gute Kommentare zu dem, worum es in der LifetimeServices Klassendokumentation geht.

AFAIK, die wahre Magie des Remotings wird durch die Remoting-Infrastruktur selbst bei der Einrichtung der Hosts erreicht. MarshalByRefObject führt keine der eigentlichen Aufgaben durch, bei denen AppHomains übergreifend verwaltet wird.

+1

In meinem Fall muss ich nur über AppDomain Grenzen kommunizieren (und das nur, weil ich eine verwaltete .DLL entladen muss). Dies macht Remoting attraktiv, weil es so einfach zu bedienen ist. –

+0

OK, wie auch immer, wenn MarshalByRefObject nicht der Schlüssel zum ganzen Prozess ist, was ist? Was genau erzeugt die mystischen Proxies usw.? –

+0

Werfen Sie einen Blick auf RemotingConfiguration.RegisterWellKnownServiceType().Ich musste nachsehen, weil ich Remoting komplett vergessen hatte, weil ich vor 2 Jahren zu WCF wechselte. WCF kann alles tun, was Sie wollen. Sie finden auch mehr Ressourcen dafür. Ich fühle mich wie der alte Chinese von "Gremlins", der das Kind vor seiner Entscheidung warnt, aber das Kind geht weiter und füttert das Ding trotzdem ... –