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

Как общаться с услугой Windows?

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

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

4b9b3361

Ответ 1

Проверьте fooobar.com/questions/tagged/.... Для этого существует ряд способов и технологий: сообщения Windows, сокеты, MMF и объекты синхронизации, именованные каналы, почтовые ящики и т.д.

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

Ответ 2

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

В вашем классе: 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:

Перечислите свои методы: (помните, что в пользовательских методах Services всегда есть 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.

Удачи!

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

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

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

Ответ 8

Ваш сервис, пока он обрабатывает, может добавлять события в 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, чтобы получить все сведения о событии и показать, что вы хотите в консольном приложении. Если вы остановите консольное приложение, служба продолжит работу и все еще будет регистрироваться в журнале событий.