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

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


Edit:

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

Ответы [ 7 ]

17 голосов
/ 17 сентября 2008

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

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

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

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

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

4 голосов
/ 17 сентября 2008

Если это приложение в трее, а не настоящая служба, будьте осторожны с настройкой связи при использовании каналов или TCP / IP. Если на компьютере подключено несколько пользователей (Citrix, Remote Desktop), и каждый пользователь запускает «службу» приложения в трее, вы можете столкнуться с ситуацией, когда несколько процессов пытаются использовать один и тот же известный порт или канал. Конечно, это не проблема, если вы не планируете поддерживать несколько каналов или если у вас есть настоящий сервис, а не приложение в трее, которое запускается в каждой пользовательской оболочке.

3 голосов
/ 26 июня 2009

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

3 голосов
/ 17 сентября 2008

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

Он очень простой и полностью кроссплатформенный.

2 голосов
/ 17 сентября 2008

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

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

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

2 голосов
/ 17 сентября 2008

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

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

2 голосов
/ 17 сентября 2008

Remoting - опция, но она не кроссплатформенная. Некоторые другие способы - использовать именованные каналы, IPC или события ядра.

...