Как взаимодействовать со службой Windows из приложения, которое взаимодействует с рабочим столом?

StackOverflow https://stackoverflow.com/questions/84860

Вопрос

С помощью .Net каков наилучший способ взаимодействия с сервисом (т. е.как большинство приложений в трее взаимодействуют со своими серверами).Было бы предпочтительнее, если бы этот метод также был кроссплатформенным (работающим в Mono, так что, я думаю, удаленное взаимодействие исключено?)


Редактировать:

Забыл упомянуть, что нам все еще приходится поддерживать компьютеры с Windows 2000 в полевых условиях, поэтому WCF и все, что выше .Net 2.0, работать не будут.

Это было полезно?

Решение

Имейте в виду, что если вы планируете в конечном итоге выполнить развертывание в Windows Vista или Windows Server 2008, многие способы, которыми это можно сделать сегодня, не будут работать.Это связано с введением новой функции безопасности под названием "Изоляция сеанса 0".

Большинство служб Windows теперь переведены для запуска в сеансе 0, чтобы должным образом изолировать их от остальной системы.Расширением этого является то, что первый пользователь, вошедший в систему, больше не помещается в сеанс # 0, он помещается в сеанс 1.И, следовательно, изоляция нарушит работу кода, который выполняет определенные типы взаимодействия между службами и настольными приложениями.

Лучший способ написать код сегодня, который будет работать в Vista и Server 2008 в будущем при обмене данными между службами и приложениями, - это использовать соответствующий межпроцессный API, такой как RPC, именованные каналы и т.д.Не используйте SendMessage / postMessage, так как это приведет к сбою при изоляции сеанса 0.

http://www.microsoft.com/whdc/system/vista/services.mspx

Теперь, учитывая ваши требования, вы окажетесь в затруднительном положении.Что касается кроссплатформенности, я не уверен, будет ли поддерживаться удаленное взаимодействие.Возможно, вам придется опуститься вниз и пройти весь путь обратно к sockets: http://msdn.microsoft.com/en-us/library/system.net.sockets.aspx

Другие советы

Если это приложение для работы в трее, а не настоящий сервис, будьте осторожны с тем, как вы настраиваете свои коммуникации, если используете каналы или TCP / IP.Если несколько пользователей вошли в систему на компьютере (Citrix, Удаленный рабочий стол), и каждый пользователь запускает приложение tray "service", то вы можете столкнуться с ситуацией, когда несколько процессов пытаются использовать один и тот же хорошо известный порт или канал.Конечно, это не проблема, если вы не планируете поддерживать несколько каналов или если у вас есть настоящий сервис, а не приложение в трее, которое запускается в каждой пользовательской оболочке.

Попросите вашу службу прослушать 127.0.0.1 на предопределенном порту с помощью простого старого сокета TCP stream.Подключитесь к этому порту из вашего настольного приложения.

Это предельно просто и полностью кроссплатформенно.

Кто-нибудь из вас действительно пробовал удаленное взаимодействие с Mono?Это работает просто отлично.Вы можете столкнуться с некоторыми неожиданными случаями, но это крайне маловероятно.Просто протестируйте свое приложение на кроссплатформенность (MS.Net <-> Mono) удаляйтесь время от времени, чтобы уловить любые возможные сбои.И начните с недавнего Mono, 2.4.2 является текущим.

Удаленное взаимодействие - это вариант, но он не является кроссплатформенным.Некоторые другие способы заключаются в использовании именованных каналов, IPC или событий ядра.

Как ни странно, я собирался предложить Удаленное взаимодействие!Тот Самый Примечания к выпуску Mono 1.0 (из archive.org поскольку исходное местоположение отсутствует) укажите System.Runtime.Remoting.dll в качестве поддерживаемой библиотеки и ничего не говорите об известных проблемах.

Если удаленная связь отключена, то вам, вероятно, придется реализовать свой собственный протокол кадрирования сообщений TCP.Windows не имеет эквивалента доменных сокетов UNIX для обмена данными на одном компьютере.

Большинство служб, имеющих компонент GUI, запускаются от имени именованного пользователя и имеют доступ к рабочему столу.Это позволяет вам получить к нему доступ через COM или .NET, но только локально (если вы не хотите усложняться).

Лично я открываю обычный старый сокет в сервисе - он кроссплатформенный, допускает несколько клиентов, позволяет любому приложению получать к нему доступ, не зависит от того, что для него открыта система безопасности Windows, и позволяет вашему графическому интерфейсу быть написанным на любом языке, который вам нравится (поскольку все поддерживает сокеты).

Для приложения tray вам нужен протокол simle для взаимодействия - вы могли бы также использовать систему в стиле REST для отправки в нее команд и обратной передачи XML (yuk) или пользовательского формата данных.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top