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

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


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

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


person Kris Erickson    schedule 17.09.2008    source источник


Ответы (7)


Имейте в виду, что если вы планируете в конечном итоге развернуть систему на 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

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

person Jason Olson    schedule 17.09.2008

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

person Jason Jackson    schedule 17.09.2008

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

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

person Wayne Bloss    schedule 17.09.2008

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

person skolima    schedule 26.06.2009

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

person Scott Dorman    schedule 17.09.2008

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

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

person Mike Dimmick    schedule 17.09.2008
comment
Судя по форумам Mono и прочим, удаленное взаимодействие в Mono не готово на 100%. Попробуйте использовать MOMA для любых функций удаленного взаимодействия, и вы увидите, что он очень неполный. - person Kris Erickson; 17.09.2008

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

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

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

person gbjbaanb    schedule 17.09.2008