如何与Windows服务通信?

问题描述 投票:0回答:9

我想创建一个 Windows 服务来验证数据并从另一个 Windows 应用程序访问它,但我是服务新手,不知道如何开始。

因此,当服务运行时,Windows 应用程序应该以某种方式连接到服务,发送一些数据并获得响应,无论是真还是假。

c# windows-services ipc
9个回答
46
投票

我可以成功处理与您的问题(几乎)相同的问题,执行以下操作:

在代表您的服务类的 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 服务的应用程序中使用它:

用于引用您的方法的枚举:(请记住,服务自定义方法始终接收 int32(128 到 255)作为参数,并且使用枚举可以更轻松地记住和控制您的方法

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 方法的更多

祝你好运!


6
投票

如果您使用.Net Framework 4,那么内存映射文件提供了一种相当简单的实现跨进程通信的方法。

它相当简单,并且在文档中进行了很好的描述,并且避免了使用 WCF 或其他基于连接/远程处理的交互或将共享数据写入中央位置和轮询的开销(在运行时以及开发工作方面)(数据库、文件等)。

请参阅此处了解概述。


3
投票

您可以通过使该服务托管 WCF 服务并从您的应用程序连接到它来轻松完成此任务。


3
投票

我们使用命名管道来实现此目的。但我们的客户端是用C++实现的。如果您的服务和应用程序是在 .Net 中实现的,您可以使用 .Net 远程处理。


2
投票

在旧版本的 Windows 中,您可以将 Windows 服务配置为与桌面交互。这允许您将用户界面元素直接添加到可以呈现给用户的服务中。从 Windows Vista 开始,服务不能再直接与用户交互,即没有用户界面。

为此,您需要编写 Windows 服务 前端 Windows 应用程序。为了提供两者之间的通信桥梁,我强烈建议使用 Windows Communication Foundation (WCF)。

要创建 C# Windows 服务,您可以按照此处的分步说明进行操作。


0
投票

将其视为远程数据库所有者。假设您有 1 个数据库,但有 10 个应用程序需要数据库中的不同数据,并且您不想向每个应用程序开放所有数据。此外,您的应用程序将独立于数据库,您的数据层将仅是在您的服务中实现,您的应用程序将不会保留该逻辑。您可以编写一个服务并将您的服务开放给其他应用程序。

如何编写你的第一个Windows服务可以帮助你。


0
投票

到目前为止,我正在做的事情似乎正在满足我的需求,就是让我的 Windows 桌面应用程序使用以下方法将值写入 CommonApplicationData 特殊文件夹中的文件:

Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)

然后我的 Windows 服务知道使用相同的方法查找文件及其中的值。

CommonApplicationData 是一个目录,用作所有用户(包括 SYSTEM 帐户)使用的特定于应用程序的数据的公共存储库。

详情请参见Environment.GetFolderPath方法Environment.SpecialFolder中的CommonApplicationData。

您可以使用任何适合您需求的文件格式:.txt、.ini、.json 等


0
投票

另一种隐式方式,您可以设置配置文件并更改它,另一个应用程序重新启动服务应用程序,然后服务应用程序重新加载配置文件。


-2
投票

您的服务在处理时可以将事件添加到事件日志中。

您可以创建另一个与服务并行运行的控制台应用程序,并使用事件处理机制侦听该 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 对象来获取所有事件详细信息,并在控制台应用程序中显示您想要的内容。如果您停止控制台应用程序,服务将继续运行,并且仍然记录到事件日志中。

© www.soinside.com 2019 - 2024. All rights reserved.