клиента:

Удаленные объекты
Удаленные объекты требуются для распределенного вычисления. Объект, вызываемый удаленно с другой системы, выводится из объектов System.MarshalByRefObject.MarshalByRefObject
и соответствует домену приложения, в котором они создаются. Это означает, что такие объекты никогда не переходят между доменами приложений; вместо этого используется объект прокси для доступа к удаленному объекту изнутри другого домена приложения. Другой домен приложения может существовать внутри того же процесса, другого процесса, или на другой системе.
Удаленный объект имеет распределенную идентичность. В связи с этим ссылка на объект может передаваться другим клиентам, и они также будут получать доступ к тому же объекту. Прокси знает об идентичности удаленного объекта.
Класс MarshalByRefObject
имеет в дополнение к унаследованным методам из класса Object
методы для инициализации и получения служб времени жизни. Службы времени жизни определяют, как долго живут удаленные объекты. Службы времени жизни и арендуемые свойства будут рассмотрены позже в этой главе.
Чтобы увидеть .NET Remoting в действии, создается простая библиотека классов для удаленного объекта. Класс Hello
выводится из System.MarshalByRefObject
. В конструкторе и деструкторе на консоли записывается сообщение, чтобы было известно о времени жизни объекта. Кроме того, имеется только один метод Greeting()
, который будет вызываться от клиента.
Для того чтобы легко различать в последующих разделах сборку и класс, дадим им различные имена аргументов, которые используют вызовы метода. Присвоим сборке имя RemoteHello.dll
, а классу — Hello
. Типом проекта Visual Studio.NET, используемым для этого класса, является Visual C# Class Library:
namespace Wrox.ProfessionalCSharp {
using System;
/// <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;
}
}
}
Простой сервер
Для сервера используется консольное приложение C#. Для применения класса TcpServerChannel
необходимо сослаться на сборку System.Runtime.Remoting.dll
. Также требуется, чтобы мы ссылались на созданную ранее сборку RemoteHello.dll
.
В методе Main()
создается объект System.Runtime.Remoting.Channel.Тcр.TcpServerChannel
с портом номер 8086. Этот канал регистрируется в классе System.Runtime.Remoting.Channels.ChannelServices
, чтобы сделать его доступным для удаленных объектов. Тип удаленного объекта регистрируется с помощью System.Runtime.Remoting.RemotingConfiguration.RegisterWellKnownServiceType
. Здесь определяется тип класса в удаленном объекте, используемый клиентом URI, и режим. Режим WellKnownObject.SingleCall
означает, что для каждого вызова метода создается новый экземпляр, мы не храним состояние в удаленном объекте.
После регистрации удаленного объекта продолжим выполнение сервера, пока не будет нажата клавиша:
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
namespace Wrox.ProfessionalCSharp {
/// <summary>
/// Краткое описание Class1
/// </summary>
public class HelloServer {
public static void Main(string[] args) {
TcpServerChannel channel = new TcpServerChannel(8086);
ChannelServices.RegisterChannel(channel);
RemotingConfiguration.RegisterWellKnownServiceType(
typeof(Hello), 'Hi', WellKnownObjectMode.SingleCall);
System.Console.WriteLine('hit to exit');
System.Console.ReadLine();
}
}
}
Простой клиент
Клиент также является консольным приложением C#. И здесь делается ссылка на сборку System.Runtime.Remoting.dll
, чтобы можно было использовать класс TcpClientChannel
. Кроме того, имеется ссылка на сборку RemoteHello.dll
. Хотя объект будет создаваться на удаленном сервере, нам понадобится сборка на стороне клиента, чтобы прокси прочитал метаданные во время выполнения.
В клиентской программе создается объект TcpClientChannel
, который регистрируется в