如何与Windows服务进行通信?

时间:2010-12-15 14:54:54

标签: c# windows-services ipc

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

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

8 个答案:

答案 0 :(得分:29)

我可以成功处理(几乎)与您相同的问题:

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

枚举引用你的方法:(记住,服务自定义方法总是接收一个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服务。 关于ExecuteCommand方法的More

祝你好运!

答案 1 :(得分:16)

检查IPC tag (Interprocess communications) on StackOverflow。有许多方法和技术可以做到这一点:Windows消息,套接字,MMF和同步对象,命名管道,邮件槽等。

作为此特定任务的最简单方法之一,我们创建了我们的CBFS IPC产品,该产品随源代码一起提供。

答案 2 :(得分:4)

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

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

有关概述,请参阅here

答案 3 :(得分:3)

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

答案 4 :(得分:2)

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

答案 5 :(得分:1)

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

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

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

答案 6 :(得分:0)

将其视为远程数据库所有者。假设您有1个数据库,但有10个应用程序需要来自数据库的不同数据,而且您不希望将所有数据打开到每个应用程序。此外,您的应用程序将独立于您的数据库,您的数据层将只是在您的服务中实现,您的应用程序将不具备该逻辑。您可以编写服务并向其他应用程序打开服务。

How to write your first windows service可以帮到你。

答案 7 :(得分:0)

您的服务在处理过程中,可以将事件添加到EventLog。

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