【问题标题】:How to use windows service created from a separate project如何使用从单独项目创建的 Windows 服务
【发布时间】:2016-07-26 07:46:57
【问题描述】:

假设我有一个现有的 Windows 窗体应用程序,并且我创建了一个新的 Windows 服务项目。

windows 窗体应用程序将作为我的应用程序的 UI,windows 服务包含一些我想稍后调用的方法。

我的问题是我怎么可能从我的 Windows 服务中调用这些方法,因为它是从一个单独的项目中创建的?应该怎么做?

假设 Windows 服务包含以下内容:

    static Boolean connectionStatus = false;

    protected override void OnStart(string[] args)
    {
        ....
        //Connect to Server
        //Once connected change the "connectionStatus" to true
    }

    protected override void OnStop()
    {
        connectionStatus = false;
    }

    //If I want to check if this Service is Connected into Server, I just call this
    public Boolean isConnected() {
        return connectionStatus;
    }

以及来自与 Windows 服务分离的项目的 Windows 窗体应用程序:

...
//Let's say I want to show a MessageBox containing if the Service is connected to Server
MyService myservice = new MyService();
MessageBox.Show("Client Status: " + myservice.isConnected()); 

【问题讨论】:

  • 您是否曾尝试将您的服务项目添加到表单应用程序并添加对它的引用?就像这里msdn.microsoft.com/en-us/library/f3st0d45.aspx
  • 你调用的是什么方法?是WCF吗?如果不是,你打电话是什么意思?另一个项目应该充当图书馆吗?在这种情况下,它是一个 Windows 服务这一事实是无关紧要的。
  • 从我的 windows 服务有一个 UDP 和 TCP 套接字函数将连接到服务器。我的 Windows 服务中至少有 3 种方法,其中一种方法是在客户端连接到服务器时返回 true 或 false。
  • 我说的是从windows服务调用方法,比如连接到服务器返回true或false
  • 不清楚为什么你需要一个windows 服务。看起来一个通信库就足够了。您需要一个 Windows 服务 if 您想与其他应用程序/服务器共享这些方法,或者在应用程序/客户端关闭时也运行它们:在这种情况下(但这不是您在这个问题中所描述的)考虑实施 WCF 服务。

标签: c# wsh


【解决方案1】:

@塞纳尔 我认为我们的时区略有不同,但现在:

您是否曾尝试将您的服务项目添加到表单中 应用程序并添加对它的引用?就像这里 msdn.microsoft.com/en-us/library/f3st0d45.aspx

【讨论】:

    【解决方案2】:

    将 connectionStatus 写入文件/数据库,如果它们在同一台机器上,则从 UI 应用程序中读取。否则你应该考虑在windows服务中实现一个WCF服务。

    简单的 WCF 实现

    主要的初始link 将指导您完成第一个实施。

    根据您的问题,您将签订一份合同

    [ServiceContract]
    public interface IConnService
    {
        [OperationContract]
        bool IsConnected();
    }
    

    及其实现

    public class ConnService: IConnService
    {
        public bool IsConnected()        
       {
            return connectionStatus; //I don't understand if it is a static variable, sorry
        }
    }
    

    然后您继续学习本教程,构建项目并使用 installutil 设置服务(但如果您已经有服务,您就会知道)。 此时,您可以从普通 Internet 浏览器检查 WCF URL 服务(serviceModel 配置中的 baseAddress)。

    由于您在 yuor 配置中还有一个所谓的 mex 端点,因此在来自 Internet 浏览器的响应中,您会发现一个简单、琐碎的 WCF 客户端 C# 示例 :-) 在您的应用程序中尝试它,在 MessageBox 行之前。

    最后说明

    无论如何,让我提醒你我最初的评论。

    不清楚为什么你需要一个windows 服务。它看起来像一个 通讯库就够了。 如果您需要 Windows 服务 希望与其他应用程序/服务器或正在运行的共享这些方法 当应用程序/客户端关闭时,它们也会:在这种情况下(但这不是 您在这个问题中描述)考虑实施 WCF 服务

    【讨论】:

    • 由于我是 Windows 服务的新手,我不知道如何实现 WCF 服务。目前 CarstenCors 建议的链接对我有用,但我搜索 WCF 服务,我很好奇哪种解决方案是最好的。我想 24/7 全天候运行服务并继续收听服务器消息并处理它,除非计算机关闭。
    • 如果你已经通过 CarstenCors 的建议解决了这个问题,你必须感谢他 :-) 我会说这是“图书馆”的方法,而且更容易。实现 wcf 会有点困难,在这种情况下可能不需要
    • 我要求@CarstenCors 将他/她的评论放入答案中,以便我可以将其标记为正确答案,但看起来 Carsten 不在身边。无论如何,谢谢您的考虑 :-) 我将继续研究 WCF 服务,看看我是否可以尽快在我的其他项目中实施它。很高兴有 Stack 用户给出的想法,无论你是谁,都非常感谢。
    • 我会帮助你处理 wcf。将在几个小时内通过示例或链接编辑此答案。谢谢
    • 哦!这对我真的很有帮助。再次,谢谢你! :-) 我将等待。谢谢!
    猜你喜欢
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多