Как связаться с Windows-сервисом? - PullRequest
32 голосов
/ 15 декабря 2010

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

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

Ответы [ 8 ]

31 голосов
/ 05 сентября 2013

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

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

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);

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

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

Удачи!

16 голосов
/ 15 декабря 2010

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

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

4 голосов
/ 15 декабря 2010

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

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

См. здесь для обзора.

3 голосов
/ 15 декабря 2010

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

2 голосов
/ 15 декабря 2010

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

1 голос
/ 15 декабря 2010

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

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

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

0 голосов
/ 20 декабря 2018

Ваш сервис, пока он обрабатывает, может добавлять события в EventLog.

Вы можете создать другое консольное приложение, которое запускает paralel для службы и прослушивает этот EventLog с помощью механизма обработки событий:

var log= new EventLog("[name of the eventlog]");
log.EnableRaisingEvents = true;
log.EntryWritten += Log_EntryWritten;

Тогда вы немедленно справитесь:

private static void Log_EntryWritten(object sender, System.Diagnostics.EntryWrittenEventArgs e)
{
    Console.WriteLine("Event detected !");
}

Вы можете прочитать объект EntryWrittenEventArgs, чтобы получить все сведения о событии и показать, что вы хотите в своем консольном приложении. Если вы остановите консольное приложение, служба продолжит работу и все еще будет регистрироваться в журнале событий.

0 голосов
/ 15 декабря 2010

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

Как написать свой первый сервис Windows может помочь вам.

...