Как общаться с услугой Windows?
Я хочу создать службу Windows, которая проверяет данные и доступ к ним из другого приложения Windows, но я новичок в сервисах, и я не уверен, как начать.
Итак, пока служба запущена, приложение Windows должно каким-то образом подключиться к службе, отправить некоторые данные и получить ответ, true или false.
Ответы
Ответ 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, чтобы получить все сведения о событии и показать, что вы хотите в консольном приложении. Если вы остановите консольное приложение, служба продолжит работу и все еще будет регистрироваться в журнале событий.