Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #72, НОЯБРЬ 2006 г.

битва в канале

ДРОЗДОВ АНДРЕЙ AKA SULVERUS

Спецвыпуск: Хакер, номер #072, стр. 072-028-2


[реализация примера взаимодействия.]

Вспомним наш абстрактный пример с Программой 1 и Программой 2. Так смоделируем же подобную ситуацию! Например, Программе 1 потребуется запустить процесс, но она не будет уметь это делать, а Программа 2 перешлет ей для запуска процесса через канал класс, хранящийся в сборке. Казалось бы, можно приступать к написанию кода, но тут я не могу не упомянуть про маленький «приятный» сюрприз от господ из Майкрософта. Во время создания платформы .NET Framework система каналов была незадокументируемой. Позже, во время выпуска Visual Studio 2003, каналы задокументировали, и в ней можно было использовать пространства имен System.Runtime.Remoting.Channels.Tcp, System.Runtime.Remoting.Channels.Http и System.Runtime.Remoting.Channels.Ipc. Используя эти классы, можно было напрямую сформировать канал и открыть его. Однако из-за каких-то глюков или недоработок в Visual Studio 2005 систему каналов хотели снова сделать недокументированной, но решили, что это не будет способствовать продажам новой студии и просто убрали вышеперечисленные пространства имен. Как всегда, в MS жгут :). Теперь работать напрямую с классами Channels.Tcp, Channels.Http и Channels.Ipc невозможо, но еще никто не отменял загрузку через файлы конфигурации! В нашем проекте мы будем использовать конфигурацию клиента и сервера через xml-файлы.

Рассмотрим подопытную модель. Сначала мы напишем класс, из которого программа будет брать объект и пересылать его другой программе. Далее мы напишем программу, которая будет создавать каналы и ожидать входящего объекта по http-каналу (условно ее можно назвать сервером). В завершение мы напишем клиент, который будет передавать серверу класс для последующей работы. Перейдем к программированию.

[пишем класс.]

Наш класс будет довольно тривиален, поскольку содержать он будет только один метод для запуска приложений. Создаем проект Class Library и пишем класс NETRemoting_Real. При написании кода обязательно следует указать, что из этого класса можно брать объекты. Это можно сделать, добавив в передаваемые классы System.MarshalByRefObject, для чего нужно использовать пространство имен System.Runtime.Remoting.Messaging. В результате остается только добавить метод для запуска процесса методом Process.Start(). В итоге получим вот такой код:

Назад на стр. 072-028-1  Содержание  Вперед на стр. 072-028-3