2010-12-15 4 views
25

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

Таким образом, пока служба работает, приложение Windows должно каким-то образом подключиться к службе, отправить некоторые данные и получить ответ, истину или ложь.

ответ

16

Проверить IPC tag (Interprocess communications) on StackOverflow. Для этого есть несколько способов и технологий: сообщения Windows, сокеты, MMF и объекты синхронизации, именованные каналы, почтовые ящики и т. Д.

В качестве одного из самых простых способов для этой конкретной задачи мы создали наш продукт CBFS IPC, который поставляется с исходным кодом.

+2

ссылка не работает, и он швы просто рекламирует – user3800527 2017-09-15 13:28:46

+0

@ user3800527 ... и по этой причине он получил множество голосов и принятие: - \. Спасибо за комментарий, однако, я обновил ссылку. – 2017-09-15 13:31:58

+0

проголосовали за вас;) – user3800527 2017-09-15 13:33:12

3

Вы можете сделать это очень легко, запустив службу сервиса WCF и подключившись к ней из вашего приложения.

+0

Это может сработать, но при этом необходимо учитывать множество последствий для безопасности. Теперь у вас есть служба с открытым портом - как вы можете проверить, кто подключается? Вы защищены от вредоносных соединений? Возможно, вам придется обойтись разрешениями для NETWORK SERVICE или просто для того, чтобы открыть соединение, тогда как ваша служба может не требовать такого уровня разрешения. В целом - я бы тщательно подумал, прежде чем реализовать это, если есть другие, более простые и безопасные варианты. – 2010-12-15 15:09:29

0

В старых версиях Windows вы можете настроить службу Windows для взаимодействия с рабочим столом. Это позволило вам добавить элементы пользовательского интерфейса непосредственно к вашей службе, которые могут быть представлены пользователю. Начиная с Windows Vista, службы больше не могут взаимодействовать напрямую с пользователями, то есть без пользовательских интерфейсов.

Чтобы сделать это, что вы хотите сделать, это написать сервис для Windows и переднего плана приложения Windows. Чтобы обеспечить коммуникационный мост между ними, я настоятельно рекомендую использовать Windows Communication Foundation (WCF).

Чтобы создать C# службу Windows, вы можете выполнить пошаговые инструкции here.

1

Для этой цели используются именованные трубы. Но наш клиент реализован с C++. Если ваша служба и приложение реализованы в .Net, вы можете использовать удаленную сеть .Net.

0

Подумайте, как удаленный владелец базы данных. Скажем, у вас есть 1 база данных еще 10 приложений, для которых требуются разные данные из базы данных, а также вы не хотите открывать все свои данные для каждого из приложений. Также ваши приложения будут независимы от вашей базы данных, ваш уровень данных будет реализованные в вашей службе, ваши приложения не будут придерживаться этой логики. Вы можете написать услугу и открыть свою службу другим приложениям.

How to write your first windows service может вам помочь.

4

Если вы используете .Net Framework 4, тогда файлы с отображением памяти обеспечивают довольно простой способ реализации межпроцессного взаимодействия.

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

См. here для обзора.

23

Я мог успешно справиться с (почти) такой же вопрос, как ваша делает следующее:

в классе: ServiceBase, который представляет ваш класс обслуживания, вы можете иметь:

public Class() //constructor, to create your log repository 
    { 
     InitializeComponent(); 

     if (!System.Diagnostics.EventLog.SourceExists("YOURSource")) 
     { 
     System.Diagnostics.EventLog.CreateEventSource(
      "YOURSource", "YOURLog"); 
     } 
     eventLog1.Source = "YOURSource"; 
     eventLog1.Log = "YOURLog"; 
    } 

Теперь, реализации:

protected override void OnStart(string[] args) 
{...} 

И

protected override void OnStop() 
{...} 

Для обработки пользовательских команд вызовов:

protected override void OnCustomCommand(int command) 
    { 
     switch (command) 
     { 
     case 128: 
      eventLog1.WriteEntry("Command " + command + " successfully called."); 
      break; 
     default: 
      break; 
     } 
    } 

Теперь, используйте это в приложении, в котором вы будете называть службы Windows:

Enum ссылаться на ваши методы: (помните, Услуги пользовательские методы всегда получают параметры int32 (от 128 до 255) в качестве параметров и используя Enum, вы упрощаете запоминание и управление своими методами.

private enum YourMethods 
    { 
    methodX = 128 
    }; 

Для вызова конкретного метода:

ServiceController sc = new ServiceController("YOURServiceName", Environment.MachineName); 
ServiceControllerPermission scp = new ServiceControllerPermission(ServiceControllerPermissionAccess.Control, Environment.MachineName, "YOURServiceName");//this will grant permission to access the Service 
    scp.Assert(); 
    sc.Refresh(); 

    sc.ExecuteCommand((int)YourMethods.methodX); 

Делая это, вы можете контролировать свои услуги.

Here вы можете проверить, как создать и установить службу Windows. More о методе ExecuteCommand.

Удачи вам!

Смежные вопросы