На этой неделе я пытался освоить Named Pipes. Задача, которую я пытаюсь решить с их помощью, заключается в том, что у меня есть существующая служба Windows, которая действует как драйвер устройства, который перенаправляет данные с внешнего устройства в базу данных. Теперь мне нужно изменить эту службу и добавить дополнительный пользовательский интерфейс (на том же компьютере, используя форму IPC), который может отслеживать данные по мере их передачи между устройством и БД, а также отправлять некоторые команды обратно в службу. .
Моими первоначальными идеями для IPC были именованные каналы или файлы с отображением памяти. До сих пор я работал над идеей именованного канала, используя Учебник по основному взаимодействию WCF Общение. Моя идея состоит в том, чтобы настроить службу Windows с дополнительным потоком, который реализует службу WCF NamedPipe, и использовать его в качестве канала для внутренних компонентов моего драйвера.
У меня работает пример кода, однако я не могу разобраться в двух проблемах, с которыми я надеюсь, что кто-то здесь может мне помочь:
В учебнике ServiceHost создается с помощью typeof (StringReverser), а не путем ссылки на конкретный класс. Таким образом, похоже, что у Сервера нет механизма для взаимодействия с самой службой (между строками host.Open () и host.Close ()). Можно ли создать связь и передавать информацию между сервером и классом, который фактически реализует службу? Если да, то как?
Если я запускаю один экземпляр сервера, а затем запускаю несколько экземпляров клиентов, кажется, что каждый клиент получает отдельный экземпляр класса обслуживания. Я попытался добавить некоторую информацию о состоянии в класс, реализующий службу, и она сохранилась только в экземпляре именованного канала. Возможно, это связано с первым вопросом, но есть ли способ заставить именованные каналы использовать тот же экземпляр класса, который реализует службу?
Наконец, есть какие-нибудь мысли о MMF и Named Pipes?
Изменить - О решении
Согласно ответу Томасра, решение заключается в использовании правильного конструктора для предоставления конкретного одноэлементного класса, реализующего службу (Конструктор ServiceHost (Object, Uri [])). Что мне тогда не понравилось, так это его ссылка на то, чтобы класс обслуживания был потокобезопасным. Простое изменение конструктора вызвало сбой на сервере, что в конечном итоге привело меня к пониманию InstanceContextMode из этой записи в блоге Instancecontextmode и Concurrencymode. Установка правильного контекста красиво завершила решение.