• Сконструировать удаленные объекты с применением программных технологий, использующих интерфейсы. В этом случае клиент может установить ссылку на двоичный блок .NET, содержащий только определения соответствующих интерфейсов, и ничего более.
• Использовать приложение командной строки soapsuds.exe. С помощью этого инструмента можно сгенерировать компоновочный блок, содержащий только метаданные удаленных типов.
• Вручную построить компоновочный блок, содержащий только метаданные удаленных типов.
Тем не менее, чтобы упростить изложение материала этой главы, мы с вами построим и установим общие компоновочные блоки, содержащие как необходимые метаданные, так и CIL-код реализации.
Замечание. Чтобы выяснить, как реализовать общие компоновочные блоки в рамках указанных выше альтернативных подходов, прочитайте книгу Tom Barnaby,
Создание распределенного приложения
Ничто не принесет большей радости, чем создание реального распределенного приложения на новой платформе. Чтобы показать, как быстро можно создать и запустить приложение, использующее слой удаленного взаимодействия .NET, мы построим простой пример такого приложения. Выше уже отмечалось, что такое приложение должно состоять из трех компоновочных блоков .NET:
• общий компоновочный блок с именем SimpleRemotingAsm.dll;
• компоновочный блок клиента с именем SimpleRemoteObjectClient.exe;
• компоновочный блок сервера с именем SimpleRemoteObjectServer.exe.
Создание общего компоновочного блока
Сначала создадим общий компоновочный блок, SimpleRemotingAsm.dll, на который будут ссылаться как сервер, так и клиент. В SimpleRemotingAsm.dll определяется единственный MBR-тип с именем RemoteMessageObject, который поддерживает два открытых члена. Метод DisplayMessage() выводит в окно консоли сервера поставляемое клиентом сообщение, a ReturnMessage() возвращает некоторое сообщение клиенту. Вот полный программный код этой новой библиотеки классов C#.
namespace SimpleRemotingAsm {
// Для этого типа при удаленном доступе
// будет иcпользоваться маршалинг до ссылке (MBR).
public class RemoteMessageObject: MarshalByRefObject {
public RemoteMessageObject() { Console.WriteLine("Создание RemoteMessageObject!"); }
// Этот метод получает входную строку
// от вызывающей стороны.
public void DisplayMessage(string msg) { Console.WriteLine("Сообщение: {0}", msg); }
// Этот метод возвращает значение вызывающей стороне.
public string ReturnMessage() { return "Привет от сервера!"; }
}
}
Наиболее интересным здесь является то, что соответствующий тип получается из базового класса System.MarshalByRefObject, в результате чего полученный класс будет гарантированно доступным с помощью агента на стороне клиента. Также обратите внимание на пользовательский вариант конструктора, заданного по умолчанию, который печатает сообщение при создании экземпляра типа. Вот и все. Теперь можете создать новый компоновочный блок SimpleRemotingAsm.dll на базе этого программного кода.
Создание компоновочного блока сервера
Напомним, что компоновочные блоки сервера обслуживают, в частности, и общие компоновочные блоки, содержащие объекты удаленного доступа. Создайте консольную программу с именем SimpleRemoteObjectServer. Роль серверного компоновочного блока заключается в том, чтобы открыть канал для поступающих запросов и зарегистрировать RemoteMessageObjесt, как WKO-объект. Сначала сошлитесь на компоновочные блоки System.Runtime.Remoting.dll и SimpleRemotingAsm.dll и обновите Main() так, как предлагается ниже.
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
using SimpleRemotingAsm;
namespace SimpleRemoteObjectServer {
class SimpleObjServer {
static void Main(string[] args) {
Console.WriteLine("*** Начало работы SimpleRemoteObjectServer! ***");
Console.WriteLine("Для завершения нажмите ‹Enter›");
// Регистрация нового HttpChannel