ΠΡΠΈΠ΅ΠΌΠ½ΠΈΠΊΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ
ΠΠ΅ΡΠΎΠ΄ 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. ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡΠΎΡΡΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΡΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΈ ΡΠ΄Π΅Π»Π°ΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠΎΠ²ΡΠΎΡΠ½ΡΡ ΠΏΠΎΠΏΡΡΠΊΡ ΠΈΠ»ΠΈ Π·Π°ΠΏΠΈΡΠ°ΡΡ Π² ΠΆΡΡΠ½Π°Π», ΠΈΠ½ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈ Ρ.Π΄.