Подтвердить что ты не робот

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

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


Edit:

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

Ответ 3

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

Он мертв просто, и он полностью пересекает платформу.

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

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

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