Π’Π΅ΠΏΠ΅ΡΡ Π½Π°ΠΌ Π½ΡΠΆΠ΅Π½ MBR-ΡΠΈΠΏ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠΈΠΏΡ JamesBondCar. Π§ΡΠΎΠ±Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠΈΡΡΠ°ΡΠΈΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎΠΉ, Π²Π°Ρ MBR-ΠΎΠ±ΡΠ΅ΠΊΡ (CarProvider) Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΠΎΠ±ΠΎΠ±ΡΠ΅Π½Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ ListβΉβΊ ΡΠΈΠΏΠΎΠ² JamesBondCar. Π’ΠΈΠΏ CarProvider ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡ Π΄Π²Π° ΡΠ»Π΅Π½Π°, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ Π²ΡΠ·ΡΠ²Π°ΡΡΠ΅ΠΉ ΡΡΠΎΡΠΎΠ½Π΅ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π·Π°Π΄Π°Π½Π½ΡΠΉ ΡΠΈΠΏ JamesBondCar, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠ»Π½ΡΠΉ ΠΏΠ΅ΡΠ΅ΡΠ΅Π½Ρ ListβΉβΊ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΡ ΡΠΈΠΏΠΎΠ². ΠΠΎΡ Π²Π΅ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠΉ ΠΊΠΎΠ΄ Π΄Π»Ρ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° ΠΊΠ»Π°ΡΡΠ°.
namespace CarGeneralAsm {
// ΠΡΠΎΡ ΡΠΈΠΏ ΡΠ²Π»ΡΠ΅ΡΡΡ MBR-ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ, ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡΠΈΠΌ Π΄ΠΎΡΡΡΠΏ
// ΠΊ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΌ MBV-ΡΠΈΠΏΠ°ΠΌ.
public class CarProvider: MarshalByRefObject {
private ListβΉJamesBondCarβΊ theJBCars = new ListβΉJamesBondCarβΊ();
// ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π² ΡΠΏΠΈΡΠΎΠΊ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΌΠ°ΡΠΈΠ½.
public CarProvider() {
Console.WriteLine("Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠΎΡΡΠ°Π²ΡΠΈΠΊΠ° ΠΌΠ°ΡΠΈΠ½");
theJBCars.Add(new JamesBondCar("QMobile", 140, true, true"));
theJBCars.Add(new JamesBondCar("Flyer", 140, true, false));
theJBCars.Add(new JamesBondCar("Swimmer", 140, false, true));
theJBCars.Add(new JamesBondCar("BasicJBC", 140, false, false));
}
// ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π²ΡΠ΅Ρ JamesBondCar.
public ListβΉJamesBondCarβΊ GetAllAutos() { return theJBCars; }
// ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ JamesBondCar,
public JamesBondCar GetJBCByIndex(int i) { return (JamesBondCar)theJBCars[i]; }
}
}
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠΎ, ΡΡΠΎ ΠΌΠ΅ΡΠΎΠ΄ GetAllAutos() Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠΉ ΡΠΈΠΏ ListβΉβΊ. ΠΡΠ΅Π²ΠΈΠ΄Π½ΡΠΉ Π²ΠΎΠΏΡΠΎΡ: ΠΊΠ°ΠΊ Π΄Π°Π½Π½ΡΠΉ ΡΠ»Π΅Π½ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° ΠΈΠΌΠ΅Π½ System. Collections.Generic ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ Π²ΡΠ·ΡΠ²Π°ΡΡΠ΅ΠΉ ΡΡΠΎΡΠΎΠ½Π΅? ΠΡΠ»ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΡΡΠΎΠ³ΠΎ ΡΠΈΠΏΠ° Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ .NET Framework 2.0 SDK, Π²Ρ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΡΠ΅, ΡΡΠΎ listβΉβΊ ΡΠΎΠΏΡΠΎΠ²ΠΎΠΆΠ΄Π°Π΅ΡΡΡ Π°ΡΡΠΈΠ±ΡΡΠΎΠΌ [Serializable].
[SerializableAttribute()]
public class ListβΉTβΊ: IList, ICollection, IEnumerable
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π΄Π»Ρ Π²ΡΠ΅Π³ΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ ΡΠΈΠΏΠ° ListβΉβΊ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ ΠΌΠ°ΡΡΠ°Π»ΠΈΠ½Π³ ΠΏΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ (Π΅ΡΠ»ΠΈ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠ΅ΡΡ Π² Π½Π΅ΠΌ ΡΠΈΠΏΡ ΡΠ°ΠΊΠΆΠ΅ Π΄ΠΎΠΏΡΡΠΊΠ°ΡΡ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ). ΠΡΠΎ ΠΎΡΠ΅Π½Ρ ΡΠ΄ΠΎΠ±Π½Π°Ρ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΡ ΡΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ .NET ΠΈ ΡΠ»Π΅Π½ΠΎΠ² Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ Π±Π°Π·ΠΎΠ²ΡΡ ΠΊΠ»Π°ΡΡΠΎΠ². ΠΠ΄ΠΎΠ±Π°Π²ΠΎΠΊ ΠΊ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΌ MBV- ΠΈ MBR-ΡΠΈΠΏΠ°ΠΌ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ°ΠΌΠΈ, Π»ΡΠ±ΠΎΠΉ ΡΠΈΠΏ ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ Π±Π°Π·ΠΎΠ²ΡΡ ΠΊΠ»Π°ΡΡΠΎΠ², ΡΠΎΠΏΡΠΎΠ²ΠΎΠΆΠ΄Π°ΡΡΠΈΠΉΡΡ Π°ΡΡΠΈΠ±ΡΡΠΎΠΌ [Serializable], ΡΠ°ΠΊΠΆΠ΅ ΡΠΏΠΎΡΠΎΠ±Π΅Π½ Π²ΡΡΡΡΠΏΠ°ΡΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ MBV-ΡΠΈΠΏΠ° Π² Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ΅ ΡΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ .NET. ΠΠ½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ, Π»ΡΠ±ΠΎΠΉ ΡΠΈΠΏ, ΠΏΠΎΠ»ΡΡΠ°ΡΡΠΈΠΉΡΡ (Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ ΠΈΠ»ΠΈ ΠΊΠΎΡΠ²Π΅Π½Π½ΠΎ) ΠΈΠ· MarshalByRefObject, ΠΌΠΎΠΆΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°ΡΡ, ΠΊΠ°ΠΊ MBR-ΡΠΈΠΏ.
ΠΠ°ΠΌΠ΅ΡΠ°Π½ΠΈΠ΅. Π‘Π»Π΅Π΄ΡΠ΅Ρ Π·Π½Π°ΡΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ SoapFormatter Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΎΠ±ΠΎΠ±ΡΠ΅Π½Π½ΡΡ ΡΠΈΠΏΠΎΠ². ΠΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ², ΠΏΠΎΠ»ΡΡΠ°ΡΡΠΈΡ ΠΈΠ»ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΠΈΡ ΠΎΠ±ΠΎΠ±ΡΠ΅Π½Π½ΡΠ΅ ΡΠΈΠΏΡ (Π½Π°ΠΏΡΠΈ-ΠΌΠ΅Ρ, ListβΉβΊ), Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ BinaryFormatter ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡ TcpChannel.
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡΠ½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° ΡΠ΅ΡΠ²Π΅ΡΠ°
ΠΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡΠ½ΡΠΉ Π±Π»ΠΎΠΊ ΡΠ΅ΡΠ²Π΅ΡΠ° (CarProviderServer.exe) Π² ΡΠ°ΠΌΠΊΠ°Ρ ΠΌΠ΅ΡΠΎΠ΄Π° Main() ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΡ Π»ΠΎΠ³ΠΈΠΊΡ.
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
using CarGeneralAsm;
namespace CarProviderServer {
class CarServer {
static void Main(string[] args) {
RemotingConfiguration.Configure("CarProviderServer.exe.config");
Console.WriteLine("Π‘ΡΠ°ΡΡ ΡΠ΅ΡΠ²Π΅ΡΠ°! ΠΠ»Ρ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π½Π°ΠΆΠΌΠΈΡΠ΅ βΉEnterβΊ");
Console.ReadLine();
}
}
}
Π‘ΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ ΡΠ°ΠΉΠ» *.config ΠΏΠΎΡΡΠΈ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ΅Π½ ΡΠ°ΠΉΠ»Ρ *.config ΡΠ΅ΡΠ²Π΅ΡΠ°, ΡΠΎΠ·Π΄Π°Π½Π½ΠΎΠΌΡ Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅. ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΌ Π·Π°ΡΠ»ΡΠΆΠΈΠ²Π°ΡΡΠΈΠΌ Π²Π½ΠΈΠΌΠ°Π½ΠΈΡ ΠΌΠΎΠΌΠ΅Π½ΡΠΎΠΌ Π·Π΄Π΅ΡΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ URI ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π΄Π»Ρ ΡΠΈΠΏΠ° CarProvider.
βΉconfigurationβΊ
βΉsystem.runtime.remotingβΊ
βΉapplicationβΊ
βΉserviceβΊ
βΉwellknown mode="Singleton" type="CarGeneralAsm.CarProvider, CarGeneralAsm" objectUri="carprovider.rem" /βΊ
βΉ/serviceβΊ
βΉchannelsβΊ
βΉchannel ref="tcp" port="32469" /βΊ
βΉ/channelsβΊ
βΉ/applicationβΊ
βΉ/system.runtime.remotingβΊ
βΉ/configurationβΊ
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡΠ½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° ΠΊΠ»ΠΈΠ΅Π½ΡΠ°
ΠΠ°ΠΊΠΎΠ½Π΅Ρ, ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ MBR-ΡΠΈΠΏ CarProvider Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΡΠΈΠΏΠΎΠ² JamesBondCars ΠΈ ΡΠΈΠΏΠ° ListβΉβΊ. ΠΠΎΡΠ»Π΅ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΈΠΏΠ° ΠΎΡ CarProvider Π²Ρ ΠΏΠΎΡΡΠ»Π°Π΅ΡΠ΅ Π΅Π³ΠΎ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ UseCar() Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ.
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
using CarGeneralAsm;
using System.Collections.Generic;
namespace CarProviderClient {
class CarClient {
private static void UseCar(JamesBondCar c) {
Console.WriteLine("-βΊ ΠΠΌΡ: {0}", Ρ.PetName);
Console.WriteLine("-βΊ ΠΠ°ΠΊc. ΡΠΊΠΎΡΠΎΡΡΡ: {0} ", Ρ.MaxSpeed);
Console.WriteLine("-βΊ Π‘ΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΡ ΠΏΠ»Π°Π²Π°ΡΡ: {0}", Ρ.isSeaWorthy);
Console.WriteLine("-βΊ Π‘ΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΡ Π»Π΅ΡΠ°ΡΡ: {0}, c.isFlightWorthy);
Console.WriteLine();
}
static void Main(string[] args) {
RemotingConfiguration.Configure("CarProviderClient.exe.config");
// Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠΎΡΡΠ°Π²ΡΠΈΠΊΠ° ΠΌΠ°ΡΠΈΠ½.
CarProvider cΡ = new CarProvider();
// ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° JBC.
JamesBondCar qCar = cp.GetJBCByIndex(0);
// ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π²ΡΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² JBC.
ListβΉJamesBondCarβΊ allJBCs = cp.GetAllAutos();
// ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Ρ.
UseCar(gCar);
// ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΡΠ΅Ρ ΠΌΠ°ΡΠΈΠ½ Π² ListβΉβΊ.
foreach(JamesBondCar j in allJBCs) UseCar(j);
Console.WriteLine(''Π‘ΡΠ°ΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°! ΠΠ»Ρ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π½Π°ΠΆΠΌΠΈΡΠ΅ βΉEnterβΊ");
Console.ReadLine();
}
}
}
Π‘ΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΡΠ°ΠΉΠ»Π° *.config Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΡΠ°ΠΊΠΆΠ΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡΠΌ. ΠΠ΄Π΅ΡΡ Π½ΡΠΆΠ½ΠΎ ΠΏΡΠΎΡΡΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ URL Π°ΠΊΡΠΈΠ²ΠΈΠ·Π°ΡΠΈΠΈ.
βΉconfigurationβΊ
βΉsystem.runtime.remotingβΊ
βΉapplicationβΊ
βΉclient displayName = "CarClient"βΊ
βΉwellknown type= "CarGeneralAsm.CarProvider, CarGeneralAsm" url="tcp://localhost:32469/carpovider.rem"/βΊ
βΉ/clientβΊ
βΉchannelsβΊ
βΉchannel ref="http" /βΊ
βΉ/channelsβΊ
βΉ/applicationβΊ
βΉ/system.runtime.remotingβΊ
βΉ/configurationβΊ
Π’Π΅ΠΏΠ΅ΡΡ Π·Π°ΠΏΡΡΡΠΈΡΠ΅ ΡΠ²ΠΎΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° (ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ ΠΆΠ΅, Π² ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅) ΠΈ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΡΠ΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ Π²ΡΠ²ΠΎΠ΄. Π ΠΎΠΊΠ½Π΅ ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Π±ΡΠ΄ΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Ρ ΠΎΠ±ΡΠ΅ΠΊΡΡ JamesBondCar ΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°. ΠΠ°ΠΏΠΎΠΌΠ½ΠΈΠΌ, ΡΡΠΎ Π²Ρ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΡΠ΅ΡΠ΅ Ρ ListβΉβΊ ΠΈ ΡΠΈΠΏΠ°ΠΌΠΈ JamesBondCar, ΠΏΠΎΡΡΠΎΠΌΡ Π²Ρ ΡΠ°Π±ΠΎΡΠ°Π΅ΡΠ΅ Ρ ΠΈΡ ΡΠ»Π΅Π½Π°ΠΌΠΈ Π² ΡΠ°ΠΌΠΊΠ°Ρ Π΄ΠΎΠΌΠ΅Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ±Π° ΡΠΊΠ°Π·Π°Π½Π½ΡΡ ΡΠΈΠΏΠ° ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½Ρ Π°ΡΡΠΈΠ±ΡΡΠΎΠΌ [Serializable].
Π§ΡΠΎΠ±Ρ Π΄ΠΎΠΊΠ°Π·Π°ΡΡ ΡΡΠΎ, ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΠ΅ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ UseCar() ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ ΠΎΠ½Π° Π²ΡΠ·ΡΠ²Π°Π»Π° ΠΌΠ΅ΡΠΎΠ΄ TurnOnRadio() Π΄Π»Ρ Π²Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° JamesBondCar. Π’Π΅ΠΏΠ΅ΡΡ Π·Π°ΠΏΡΡΡΠΈΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Π΅ΡΠ΅ ΡΠ°Π·. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠΎ, ΡΡΠΎ Π½Π° ΠΌΠ°ΡΠΈΠ½Π΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΡΠ΅ΠΏΠ΅ΡΡ ΠΏΠΎΡΠ²Π»ΡΡΡΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ. ΠΡΠ»ΠΈ Π±Ρ ΡΠΈΠΏΡ Car, Radio ΠΈ JamesBondCar Π±ΡΠ»ΠΈ ΡΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠΎΠ²Π°Π½Ρ, ΠΊΠ°ΠΊ MBR-ΡΠΈΠΏΡ, ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π±Ρ ΠΏΠΎΡΠ²Π»ΡΠ»ΠΈΡΡ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅. ΠΠ»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· ΡΠΊΠ°Π·Π°Π½Π½ΡΡ ΡΠΈΠΏΠΎΠ² ΠΈΠ· MarshalByRefObject ΠΈ ΠΏΠ΅ΡΠ΅ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠΉΡΠ΅ Π²ΡΠ΅ ΡΡΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡΠ½ΡΡ Π±Π»ΠΎΠΊΠ° (Π΄Π»Ρ Π³Π°ΡΠ°Π½ΡΠΈΠΈ ΡΠΎΠ³ΠΎ, ΡΡΠΎ Visual Studio 2005 ΡΠΊΠΎΠΏΠΈΡΡΠ΅Ρ ΡΠ°ΠΌΡΠΉ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ CarGeneralAsm.dll Π² ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ°). Π’Π΅ΠΏΠ΅ΡΡ ΠΏΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΎΠΊΠ½ΠΎ Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎΡΠ²ΠΈΡΡΡ Π½Π° ΡΠ΄Π°Π»Π΅Π½Π½ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Π΅.
ΠΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄. ΠΡΠΎΠ΅ΠΊΡΡ CarGeneralAsm, CarProviderServer ΠΈ CarProviderClient ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½Ρ Π² ΠΏΠΎΠ΄ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π΅, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅ΠΌ Π³Π»Π°Π²Π΅ 18.
ΠΠ±ΡΠ΅ΠΊΡΡ, Π°ΠΊΡΠΈΠ²ΠΈΠ·ΠΈΡΡΠ΅ΠΌΡΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ
ΠΡΠ΅ ΡΠΎΠ·Π΄Π°Π½Π½ΡΠ΅ Π΄ΠΎ ΡΠΈΡ ΠΏΠΎΡ ΠΏΡΠΈΠΌΠ΅ΡΡ ΡΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ WKO-ΡΠΈΠΏΡ. ΠΠ°ΠΏΠΎΠΌΠ½ΠΈΠΌ, ΡΡΠΎ WKO-ΡΠΈΠΏΡ ΠΈΠΌΠ΅ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠΈ.
β’ WKO-ΡΠΈΠΏ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠ°ΠΊ ΡΠΈΠ½Π³Π»Π΅Ρ ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΎΠ΄ΠΈΠ½ΠΎΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π°.
β’ WKO-ΡΠΈΠΏ ΠΌΠΎΠΆΠ½ΠΎ Π°ΠΊΡΠΈΠ²ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ° ΡΠΈΠΏΠ°, Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ.
β’ ΠΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ WKO-ΡΠΈΠΏΠ° ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅ ΠΏΡΠΈ ΠΏΠ΅ΡΠ²ΠΎΠΌ Π·Π°ΠΏΡΠΎΡΠ΅ ΡΠ»Π΅Π½Π° ΡΡΠΎΠ³ΠΎ ΡΠΈΠΏΠ° ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ,
ΠΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ Π‘ΠΠ-ΡΠΈΠΏΠΎΠ², Ρ Π΄ΡΡΠ³ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π»ΡΠ±ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ° ΡΠΈΠΏΠ°, ΠΈ ΠΎΠ½ΠΈ ΡΠΎΠ·Π΄Π°ΡΡΡΡ ΡΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ C# new ΠΈΠ»ΠΈ ΡΠΈΠΏ Activator. Π¦ΠΈΠΊΠ» ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΡ Π‘ΠΠ-ΡΠΈΠΏΠΎΠ² ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΡΠ΅ΡΡΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠΎΠΌ Π»ΠΈΠ·ΠΈΠ½Π³ΠΎΠ²ΠΎΠ³ΠΎ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ .NET. Π‘Π»Π΅Π΄ΡΠ΅Ρ Π·Π½Π°ΡΡ, ΡΡΠΎ ΠΏΡΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π‘ΠΠ-ΡΠΈΠΏΠ° ΡΠ»ΠΎΠΉ ΡΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ .NET Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ Π‘ΠΠ-ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Π΄Π»Ρ ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΡ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°. ΠΠ°ΠΆΠ½ΠΎΠΉ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΡΡ Π‘ΠΠ-ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎ, ΡΡΠΎ ΠΎΠ½ΠΈ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡΡ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°ΡΡ ΠΏΠΎΡΠ»Π΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π²ΡΠ·ΠΎΠ²Π° ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π° (ΠΈ, ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΠ²Π»ΡΡΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ, ΠΊΡΠΌΡΠ»ΡΡΠΈΠ²Π½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡΠΈΠΌΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΡΠ²ΠΎΠ΅Π³ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π²ΡΠ·ΠΎΠ²ΠΎΠ² ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ²).
Π§ΡΠΎΠ±Ρ ΠΏΡΠΎΠΈΠ»Π»ΡΡΡΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π‘ΠΠ-ΡΠΈΠΏΠΎΠ², ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΡΠ΅ΠΌ Π½Π°Ρ ΡΠΆΠ΅ ΠΈΠΌΠ΅ΡΡΠΈΠΉΡΡ "Π°Π²ΡΠΎΠΌΠΎΠ±ΠΈΠ»ΡΠ½ΡΠΉ" ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡΠ½ΡΠΉ Π±Π»ΠΎΠΊ. Π Π½Π°ΡΠ΅ΠΌ MBR-ΠΊΠ»Π°ΡΡΠ΅ CarProvider ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠΉ ΠΊΠ»ΠΈΠ΅Π½ΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΌΠ°ΡΡΠΈΠ² ΡΠΈΠΏΠΎΠ² JamesBondCar, ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π½ΡΡ Π΄Π»Ρ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π² ΠΎΠ±ΠΎΠ±ΡΠ΅Π½Π½ΠΎΠΌ ΡΠΏΠΈΡΠΊΠ΅ ListβΉβΊ.
public class CarProvider: MarshalByRefObject {
private ListβΉJamesBondCarβΊ theJBCars = new ListβΉJamesBondCarβΊ();