.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?
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. –
WCF nadal obsługuje MarshalByRefObject – Schneider
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. –