【问题标题】:How to call method from running windows service如何从正在运行的 Windows 服务调用方法
【发布时间】:2009-12-30 08:05:37
【问题描述】:

我已经使用 c# 2005 创建并启动了 Windows 服务 Service1(使用 exe 作为 MyService.exe)。 我已经包含了一个 GetMyRandomNumber() 方法,它返回一个随机的双精度值。

这里的问题是如何使用这个正在运行的服务以及我如何调用该方法。

我已尝试添加 MyService.exe 的引用并以 -

的身份访问该方法
Service1 s = new Service1();
MessageBox.Show(s.GetMyRandomNumber().ToString());

但发现该方法不是从正在运行的服务实例调用的,即即使我停止服务,语句也会被执行。

谁能解释我如何从正在运行的服务实例中调用该方法。

感谢您分享宝贵的时间。

【问题讨论】:

    标签: c# windows-services .net-2.0


    【解决方案1】:

    在您的代码中,您实际上并没有调用服务,而是引用可执行文件并从该程序集调用方法(在运行时,.NET Framework 将使用本地程序集来执行代码,而不是您正在运行的程序集)服务)。

    要做你想做的事,你有很多选择。

    在 .NET 2.0 中,您将使用 .NET Remoting。您创建一个远程接口,其他程序集可以使用该接口跨可执行文件调用方法。

    在 .NET 3.0 中,远程处理已被 WCF 取代。您的服务将成为 WCF 服务,它将公开 GetRandomNumber() 作为其数据合同的一部分。应用程序可以使用合约并连接到您的服务以调用该方法。

    网络上有许多关于 .NET Remoting 或其替代品 Windows Communication Foundation 的优秀教程。

    【讨论】:

    • 如果在 .NET 3.0+ 上,+1 WCF 将是这种情况下的正确选择。为了完整起见,我想补充一点,尽管 WCF 在几乎所有情况下都替换了 Remoting,但它仍然具有跨 AppDomain 通信的利基——我不会使用 WCF 跨 AppDomain 边界进行通信,但在所有其他情况下,WCF 是正确的选择。
    【解决方案2】:

    你应该看看 Remoting

    【讨论】:

    • 如果在 .NET 3.0+ 上,远程处理不是一个好的选择。我更喜欢艾伦的回答。
    【解决方案3】:

    WCF 对于在同一台计算机上的通信来说是一种过度杀伤力。 Pipes 是一种更简单有效的解决方案。

    【讨论】:

    • 他使用的是 C# 2005 (.Net 2.0 ?) 所以 WCF 不是一个选项。
    • 观察力不错。我没有注意到。
    • 我正在寻找 WCF 的替代方案,您的回答得到了我的投票
    【解决方案4】:

    与正在运行的服务通信与在任何其他正在运行的进程上调用方法没有什么不同。这意味着您需要挖掘出用于进程间通信的标准工具。

    Windows Communication Foundation (WCF) 将是我的默认选择。您可以在 Windows 服务中托管 WCF 服务,并通过命名管道端点公开它以实现高效通信。

    【讨论】:

      【解决方案5】:

      您可以使用Windows Communication Foundation 和IPC (inter-process communication) 与您的服务通信并执行您的方法。

      【讨论】:

        猜你喜欢
        • 2011-09-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-27
        • 1970-01-01
        • 2012-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多