Межпроцессная коммуникация посредством .NET

ОГЛАВЛЕНИЕ

Данная статья предоставляет простой способ использования .Net-сообщений среди приложений, не требущий особых усилий в конфигурации. В качестве альтернативы сообщениям на основе .NET Remoting предоставляется простая библиотека, основаная на сообщениях Windows низкого уровня.

•    Загрузить демо-проект - 85.41 KB
•    Загрузить исходный код - 11.99 KB

Введение

Данная статья показывает быструю и простую в применении реализацию для связи между доменами приложений в .NET путем использования родной передачи сообщений Windows. Библиотека XDMessaging основана на коде, разработанном для ускорения быстрой разработки для недавнего проекта Vista, требовавшего много связи между доменами приложений в защищенной среде. Библиотека оказалась крайне полезной в ряде ситуаций, где дистанционная связь .NET была бы непрактична или даже невозможна, и решила много проблем при своей простоте. Библиотека предназначена для отправки сообщений между несколькими приложениями в условиях одного и того же окна. Например, приложению панели задач может требоваться связаться  или следить за отдельным настольным приложением.

Библиотека не реализует междоменную связь через сеть, для которой достаточно дистанционной связи .NET.

Обновление: XDMessaging 2.0 сейчас доступна здесь и вводит поддержку для служб и консольных приложений Windows.

Предыстория

Почему бы не использовать дистанционную связь .NET? Она слишком долго устанавливается и настраивается. Другая проблема – отсутствие отправки полезных отчетов об ошибках, когда что-то не удается, всегда с разрешениями. Это не критика дистанционной связи .NET. Она имеет намного больше функций, чем данная реализации, и, разумеется, не ограничена связью в одном окне. Но для связи в одном и том же окне она не должна быть столь сложной. Почему бы не использовать передачу сообщений Windows? Этот механизм неуправляемые приложения используют именно для данной цели. Есть идея…
Возможно, вы не знали, но сообщения Windows – низкоуровневые средства связи, используемые операционной системой Windows для передачи информации о вводе данных пользователем, изменениях системы и других событиях, на которые могут реагировать приложения, работающие в системе. Например, перерисовки приложения запускаются сообщением WM_PAINT. Кроме системных сообщений, неуправляемые приложения могут определять пользовательские сообщения Windows и использовать их для связи с другими окнами. Они обычно принимают вид сообщений WM_USER. Если у вас установлен Spy++ (инструменты Visual Studio), можно отслеживать в реальном времени все сообщения, принимаемые окном.

Библиотека XDMessaging

Библиотека XDMessaging предоставляет простое в использовании, не требующее настройки решение для связи между доменами приложений в одном и том же окне. Она предоставляет простой интерфейс прикладного программирования (API) для отправки и приема адресных строковых сообщений через границы приложений. Библиотека позволяет использовать определенные пользователем 'псевдоканалы', через которые сообщения могут отправляться и приниматься. Любое приложение может отправить сообщение любому каналу, но оно должно зарегистрироваться как слушатель в канале, чтобы принимать. Таким образом, разработчики могут быстро и программно придумать, как лучше их приложениям связываться друг с другом и работать согласованно.

Пример: Отправка сообщения

// Отправить сообщение отключения каналу по имени commands(команды)
XDBroadcast.SendToChannel("commands", "shutdown");

Пример: Слушание канала

// Создать экземпляр слушателя
XDListener listener = new XDListener();

// Зарегистрироваться в каналах для слушания
listener.RegisterChannel("events");
listener.RegisterChannel("status");
listener.RegisterChannel("commands");

// Перестать слушать конкретный канал
listener.UnRegisterChannel("status");

Пример: Обработка сообщений

// Прикрепить обработчик события к экземпляру
listener.MessageReceived+=XDMessageHandler(this.listener_MessageReceived);

// Обработать сообщение
private void listener_MessageReceived(object sender, XDMessageEventArgs e)
{
    // e.DataGram.Message - сообщение
    // e.DataGram.Channel – имя канала
    switch(e.DataGram.Message)
    {
        case "shutdown":
            this.Close();
            break;
    }
}

Демонстрационный пример мессенджера

Чтобы увидеть демонстрационный пример, вам придется запустить несколько экземпляров приложения Messenger.exe. Демонстрационная программа не служит никакой практической цели, кроме демонстрации использования библиотеки XDMessaging. Она показывает передачу сообщений нескольким экземплярам настольного приложения через границы приложений. Приложение использует два произвольных канала по имени Status(статус) и UserMessage(сообщение пользователя). События окна, такие как onClosing и onLoad, передаются как сообщения в канал Status (отображаются зелеными), а сообщения пользователя передаются в канал UserMessage (отображаются синими). Отмечая или снимая выделение опций, можно переключать канал, сообщения которого будет слушать окно.