Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«C# для профСссионалов. Π’ΠΎΠΌ IIΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 90

Автор Π‘ΠΈΠΌΠΎΠ½ Робинсон

ΠŸΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠΈ сообщСний

ΠœΠ΅Ρ‚ΠΎΠ΄ Activator.GetObject() Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ RemotingServicesConnect() для соСдинСния с Ρ…ΠΎΡ€ΠΎΡˆΠΎ извСстным ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ. Π’ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ Connect() происходит Unmarshal(), Π³Π΄Π΅ создаСтся Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ прокси, Π½ΠΎ ΠΈ ΡƒΠΏΠΎΠ»Π½ΠΎΠΌΠΎΡ‡Π΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠΈ. ΠŸΡ€ΠΎΠΊΡΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ ΡƒΠΏΠΎΠ»Π½ΠΎΠΌΠΎΡ‡Π΅Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠΎΠ² для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ сообщСния Π² ΠΊΠ°Π½Π°Π». ВсС ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ сообщСниС ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ дСйствия, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ созданиС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, запись события, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ бСзопасности ΠΈ Ρ‚.Π΄.

ВсС ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠΈ событий Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ интСрфСйс IMessageSink. Π’Π°ΠΊΠΎΠΉ интСрфСйс опрСдСляСт ΠΎΠ΄Π½ΠΎ свойство ΠΈ Π΄Π²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π°:

β–‘ Бвойство NextSink ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠΎΠΌ для получСния ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ° ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ сообщСния дальшС.

β–‘ Π”ля синхронных сообщСний вызываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ SyncProcessMessage() ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠΎΠΌ ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΉ инфраструктурой. Он ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ IMessage для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° сообщСния.

β–‘ Π”ля асинхронных сообщСний вызываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ AsyncProcessMessage() ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠΎΠΌ Π² Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅ ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΉ инфраструктурой. AsyncProcessMessage() ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, ΠΊΡƒΠ΄Π° ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒΡΡ сообщСниС ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊ сообщСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‚.

Рассмотрим Ρ‚Ρ€ΠΈ доступных для использования ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ° сообщСния.

Π£ΠΏΠΎΠ»Π½ΠΎΠΌΠΎΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊ

МоТно ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ ΡƒΠΏΠΎΠ»Π½ΠΎΠΌΠΎΡ‡Π΅Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ интСрфСйса IEnvoyInfo. ΠœΠ°Ρ€ΡˆΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Π°Ρ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Π°Ρ ссылка ObjRef ΠΈΠΌΠ΅Π΅Ρ‚ свойство EnvoyInfo, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ интСрфСйс IEnvoyInfo. Бписок ΡƒΠΏΠΎΠ»Π½ΠΎΠΌΠΎΡ‡Π΅Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠΎΠ² создаСтся ΠΈΠ· сСрвСрного контСкста, поэтому сСрвСр ΠΌΠΎΠΆΠ΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ. Π£ΠΏΠΎΠ»Π½ΠΎΠΌΠΎΡ‡Π΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠΈ ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± идСнтичности ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈ ΠΏΡ€Π΅Π΄Π°ΡŽΡ‚ Π΅Π΅ сСрвСру.

ΠŸΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊ сСрвСрного контСкста

Когда сообщСниС ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ Π½Π° сСрвСрной сторонС ΠΊΠ°Π½Π°Π»Π°, ΠΎΠ½ΠΎ пСрСдаСтся ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ°ΠΌ сСрвСрного контСкста. ПослСдний ΠΈΠ· этих ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠΎΠ² направляСт сообщСниС Π² Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠΎΠ².

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊ

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊ ассоциируСтся с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ. Если ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ класс опрСдСляСт Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ контСкста, Ρ‚ΠΎ для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠΈ контСкста.

ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹

Π’ΠΈΠΏΡ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² для Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π±Π°Π·ΠΎΠ²Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, Π½ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ Ρ‚Π°ΠΊΠΆΠ΅ Π±Ρ‹Ρ‚ΡŒ классами, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ опрСдСляСт программист. Для ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‚ Ρ‚Ρ€ΠΈ Ρ‚ΠΈΠΏΠ° классов:

β–‘ ΠšΠ»Π°ΡΡΡ‹, ΠΌΠ°Ρ€ΡˆΠ°Π»ΠΈΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΡƒΡŽΡ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· ΠΊΠ°Π½Π°Π». ΠšΠ»Π°ΡΡΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΌΠ°Ρ€ΡˆΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹, Π»ΠΈΠ±ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ интСрфСйс ISerializable, Π»ΠΈΠ±ΠΎ ΠΏΠΎΠΌΠ΅Ρ‡Π°ΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° [Serializable]. ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ этих классов Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΉ идСнтичности, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ вСсь ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΌΠ°Ρ€ΡˆΠ°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· ΠΊΠ°Π½Π°Π», Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сСриализуСтся ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ, являСтся нСзависимым ΠΎΡ‚ сСрвСрного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° (ΠΈΠ»ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚). ΠšΠ»Π°ΡΡΡ‹, ΠΌΠ°Ρ€ΡˆΠ°Π»ΠΈΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ, Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ‚Π°ΠΊΠΆΠ΅ нСсвязанными классами, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ зависят ΠΎΡ‚ Π΄ΠΎΠΌΠ΅Π½Π° прилоТСния.

β–‘ ΠšΠ»Π°ΡΡΡ‹, ΠΌΠ°Ρ€ΡˆΠ°Π»ΠΈΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΏΠΎ ссылкС, ΠΈΠΌΠ΅ΡŽΡ‚ ΡƒΠ΄Π°Π»Π΅Π½Π½ΡƒΡŽ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒ. ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π½Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΠΏΠΎ линиям связи, Π° вмСсто этого возвращаСтся прокси. Класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠ°Ρ€ΡˆΠ°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠΎ ссылкС, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ ΠΈΠ· MarshalByRefObject. ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ MarshalByRefObject Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ, связанными с Π΄ΠΎΠΌΠ΅Π½ΠΎΠΌ прилоТСния. Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ вСрсиСй MarshalByRefObject являСтся класс ContextBoundObject: абстрактный класс ContextBoundObject выводится ΠΈΠ· MarshalByRefObject. Если класс выводится ΠΈΠ· ContextBoundObject, трСбуСтся прокси Π΄Π°ΠΆΠ΅ Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ самом Π΄ΠΎΠΌΠ΅Π½Π΅ прилоТСния, ΠΊΠΎΠ³Π΄Π° ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°ΡŽΡ‚ΡΡ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ контСкстов.

β–‘ ΠšΠ»Π°ΡΡΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ сСриализуСмыми ΠΈ Π½Π΅ выводятся ΠΈΠ· MarshalByRefObject, Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°Ρ… ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Π­Ρ‚ΠΈ классы связаны с Π΄ΠΎΠΌΠ΅Π½ΠΎΠΌ прилоТСния, Π³Π΄Π΅ ΠΎΠ½ΠΈ созданы. Π’Π°ΠΊΠΈΠ΅ классы Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ, Ссли класс ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‡Π»Π΅Π½Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, допустимыС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Π΄ΠΎΠΌΠ΅Π½Π΅ прилоТСния, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ дСскриптор Ρ„Π°ΠΉΠ»Π° Win32.

Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΌΠ°Ρ€ΡˆΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π² дСйствии, ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ для пСрСсылки Π΄Π²ΡƒΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ: ΠΏΡƒΡΡ‚ΡŒ класс MySerialized посылаСт ΠΌΠ°Ρ€ΡˆΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ, Π° класс MyRemote ΠΌΠ°Ρ€ΡˆΠ°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΏΠΎ ссылкС. Π’ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ… сообщСниС записываСтся Π½Π° консоль, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ, сдСлан Π»ΠΈ Π²Ρ‹Π·ΠΎΠ² Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π΅ ΠΈΠ»ΠΈ Π½Π° сСрвСрС. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, класс Hello измСняСтся, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ экзСмпляры MySerilized ΠΈ MyRemote:

using System;

namespace Wrox.ProfessionalCSharp {

 [Serilizable]

 public сlass MySerilized {

  public MySerilized(int val) {

   a = val;

  }

  public void Foo() {

   Console.WriteLine("MySerialized.Foo called");

  }

  public int A {

   get {

    Console.WriteLine("MySerialized A called");

    return a;

   }

   set {

    a = value;

   }

  }

  protected int a;

 }


 public class MyRemote : System.MarshalByRefObject {

  public MyRemote(int val) {

   a = val;

  }

  public void Foo() {

   Console.WriteLine("MyRemote.Foo called");

  }

  public int A {

   get

    Π‘onsole.WriteLine("MyRemote.A called");

    return a;

   }

   set {

    a = value;

   }

  }

  protected int a;

 }


 /// <summary>

 /// ΠšΡ€Π°Ρ‚ΠΊΠΎΠ΅ описаниС Class1

 /// </summary>

 public class Hello : System.MarshalByRefObject {

  public Hello() {

   Console.WriteLine("Constructor called");

  }

  ~Hello() {

   Console.WriteLine("Destructor called");

  }

  public string Greeting(string name) {

   Console.WriteLine("Greeting called");

   return "Hello, " + name;

  }

  public MySerialized GetMySerilized() {

   return new MySerialized(4711);

  }

  public MyRemote GetMyRemote() {

   return new MyRemote(4712);

  }

 }

}

ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΏΡ€ΠΈ использовании ΠΌΠ°Ρ€ΡˆΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΈ ΠΏΠΎ ссылкС. ΠœΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ GetMySerialized() ΠΈ GetMyRemote(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π»ΠΈ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΉ прокси.

ChannelServices.RegisterChannel(new TcpChannel());

Hello obj =

 (Hello)Activator.GetObject(typeof(Hello),

 "tcp://localhost:8086/Hi");

if (obj == null) {

 Console.WriteLine("could not locate server");

 return;

}

MySerialized ser = obj.GetMySerialized();

if (!RemotingServices.IsTransparentProxy(ser)) {

 Console.WriteLine("ser is not a transparent proxy");

}

ser.Foo();

MyRemote rem = obj.GetMyRemote();

if (RemotingServices.IsTransparentProxy(rem)) {

 Console.WriteLine("rem is a transparent proxy");

}

rem.Foo();

Π’ консольном ΠΎΠΊΠ½Π΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ser вызываСтся Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π΅. Π­Ρ‚ΠΎΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ являСтся ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΌ прокси, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ сСриализуСтся ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ этому, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ rem Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π΅ являСтся ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΌ прокси. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹, Π²Ρ‹Π·Π²Π°Π½Π½Ρ‹Π΅ для этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π½Π° сСрвСр:

Π’ сСрвСрном Π²Ρ‹Π²ΠΎΠ΄Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ Foo() вызываСтся с ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ MyRemote:

ΠΠ°ΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹

Π£Π΄Π°Π»Π΅Π½Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΠΏΠΎ линиям связи Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈ сСриализуСмых классов. Иногда ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΡΠ»Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΠ΄Π½ΠΎΠΌ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ. Π­Ρ‚ΠΎ особСнно Π²Π°ΠΆΠ½ΠΎ, ΠΊΠΎΠ³Π΄Π° Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΠΏΠΎ сСта. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ COM ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ для Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π½Π°ΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ [in], [out] ΠΈ [in, out], Ссли Π΄Π°Π½Π½Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° сСрвСр, ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ ΠΈΠ»ΠΈ Π² ΠΎΠ±ΠΎΠΈΡ… направлСниях.

Π’ C# ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ языка: ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ref ΠΈ out. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ref ΠΈ out ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈ для ссылочных Ρ‚ΠΈΠΏΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ способны ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ref Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΌΠ°Ρ€ΡˆΠ°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ΡΡ Π² ΠΎΠ±ΠΎΠΈΡ… направлСниях, out ΠΈΠ΄Π΅Ρ‚ ΠΎΡ‚ сСрвСра ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ, Π° Π² отсутствиС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° посылаСт Π΄Π°Π½Π½Ρ‹Π΅ сСрвСру.

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΆΠΈΠ·Π½ΠΈ

Как ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈ сСрвСр ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚, какая Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΈ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ этом другая сторона Π±ΠΎΠ»Π΅Π΅ нСдоступна?

Для ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΎΡ‚Π²Π΅Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΌ. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ для ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° System.Runtime.Remoting.RemotingException. НСобходимо просто ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ это ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΡƒΡŽ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΡƒ ΠΈΠ»ΠΈ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² ΠΆΡƒΡ€Π½Π°Π», ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ Ρ‚.Π΄.