2010-04-27 12 views
47

.NET ma funkcję zwaną remoting, w której można przekazywać obiekty pomiędzy oddzielnymi aplikacjami lub nawet maszynami fizycznymi. Nie w pełni rozumiem, jak działa magia, stąd to pytanie.Czy MarshalByRefObject jest wyjątkowy?

W sieci zdalnej są dwa podstawowe sposoby przekazywania obiektów - albo mogą być przekształcone do postaci szeregowej (konwertowane na kilka bajtów i przebudowane na drugim końcu), albo mogą dziedziczyć po MarshalByRefObject, w takim przypadku .NET sprawia, że ​​niektóre transparentne serwery proxy i wszystkie wywołania metod są przekazywane z powrotem do oryginalnej instancji.

To jest całkiem fajne i działa jak magia. I nie lubię magii w programowaniu. Patrząc na MarshalByRefObject z reflektorem, nie widzę niczego, co odróżniłoby go od jakiegokolwiek innego typowego obiektu. Nie ma nawet dziwnego wewnętrznego atrybutu ani niczego. Jak zorganizowane jest całe przezroczyste proxy? Czy mogę sam stworzyć taki mechanizm? Czy mogę utworzyć alternatywny MyMarshalByRefObject, który nie dziedziczy po MarshalByRefObject, ale nadal będzie działał tak samo? Czy też jest MarshalByRefObject, otrzymujący specjalne traktowanie przez silnik .NET, a cały program do zdalnego przetwarzania nie jest dublowany przez zwykłych śmiertelników?

+1

Jeśli .NET Remoting traktuje wszystkie klasy, które dziedziczą po MarshalByRefObject w specjalny sposób, czy to kwalifikuje się do "MarshalByRefObject jest wyjątkowy"? Użyj reflektora na .NET Remoting i znajdź magię. BTW, .NET Remoting jest przestarzały, podobnie jak MarshalByRefObject. Oczywiście można go użyć, ale WCF jest obecnie dominującą "architekturą zdalną" w .NET. –

+1

WCF nadal obsługuje MarshalByRefObject – Schneider

+7

Magia jest w jitterze, traktuje klasy MBRO jako specjalne. Nie ma już bezpośredniego dostępu do pól w klasie, ale generuje kod do użycia metody pomocnika języka CLR. Który zdaje sobie sprawę, że obiekt jest remotowany, więc wie, kiedy wygenerować połączenie proxy. –

Odpowiedz

17

Magia wydaje się być w specjalnej klasie TransparentProxy -. Runtime .NET obsługuje ją w specjalny sposób.

MarshalByRefObject myślę, że może zawierać pewne dodatkowe informacje wewnętrzne, które mogą być pomocne dla tego mechanizmu, ale nie patrzyłem w to zbyt wiele.

+0

Artykuł o RealProxy jest zepsuty (lub przynajmniej * prywatny *) –

+1

Dzięki za informacje, wygląda tak też dla mnie :-(Niestety, nie mogę go znaleźć również na web.archive.org Może próbuję skontaktować się z autorem @ thomas-danecker osobiście może w jakiś sposób pomóc – akavel

+0

Dla jasności, MarshalByRefObject i klasy wywodzące się z ARE są wyjątkowe, podobnie jak ValueTypes są specjalne: JIT zmienia niektóre z generowanych przez nie kodów podczas pracy z MarshalByRefObject i wyłącza pewne optymalizacje Jeśli masz odniesienie do dowolnego obiektu "x", który pochodzi od MarshalByRefObject, JIT musi zawsze brać pod uwagę możliwość, że x jest przezroczystymProxy do odległego obiektu.Na przykład, wstawianie może być wyłączone lub strzeżone za pomocą sprawdzenia, aby sprawdzić czy "x" jest najpierw lokalnym lub zdalnym – Qwertie

4

Wierzę, że MarshalByRefObject nie jest aż tak wyjątkowy. Wierzę, że cały jego powód do życia spoczywa na zarządzaniu jego życiem i na tym, jak jest zbierany na serwerze. Jest kilka dobrych komentarzy na ten temat w dokumentacji klasy LifetimeServices.

AFAIK, prawdziwa magia zdalnego sterowania jest wykonywana przez infrastrukturę zdalnego dostępu podczas konfigurowania hostów. MarshalByRefObject nie wykonuje żadnej realnej pracy nad porządkowaniem rzeczy w AppDomains.

+1

W moim przypadku muszę komunikować się tylko przez granice AppDomain (i to tylko dlatego, że muszę wyładować zarządzane .DLL). Dzięki temu Remoting jest atrakcyjny, ponieważ jest tak prosty w użyciu. –

+0

OK, w każdym razie, jeśli MarshalByRefObject nie jest kluczem do całego procesu, co to jest? Co dokładnie tworzy mistyczne proxy? –

+0

Zobacz RemotingConfiguration.RegisterWellKnownServiceType().Musiałem to sprawdzić, ponieważ zapomniałem o Remotingu, ponieważ przeszedłem do WCF 2 lata temu. WCF może zrobić wszystko, co chcesz. Znajdziesz tam również więcej zasobów. Czuję się jak stary Chińczyk z "Gremlins", który ostrzega dzieciaka o swojej decyzji, ale dzieciak idzie dalej i karmi to i tak ... –

Powiązane problemy