C# 从windows服务控制我的应用程序

C# 从windows服务控制我的应用程序,c#,windows,service,windows-services,C#,Windows,Service,Windows Services,我有一个C#桌面应用程序,它有一些用户输入字段和两个按钮——开始和停止。单击开始,它将连接到服务器/外部设备。连接后,用户可以输入数据并将信息发送到服务器/外部设备。现在我需要创建一个Windows服务来自动启动和停止与服务器的连接。我指的是与服务器建立连接的服务(就像启动按钮一样) 目前,我已在解决方案文件中添加了一个新的Windows服务项目。现在,我的解决方案文件有两个.exe文件。第一个用于构建用户应用程序,另一个用于构建Windows服务 我的实际问题是:我是否可以在Service1.

我有一个C#桌面应用程序,它有一些用户输入字段和两个按钮——开始和停止。单击开始,它将连接到服务器/外部设备。连接后,用户可以输入数据并将信息发送到服务器/外部设备。现在我需要创建一个Windows服务来自动启动和停止与服务器的连接。我指的是与服务器建立连接的服务(就像启动按钮一样)

目前,我已在解决方案文件中添加了一个新的Windows服务项目。现在,我的解决方案文件有两个.exe文件。第一个用于构建用户应用程序,另一个用于构建Windows服务


我的实际问题是:我是否可以在Service1.cs文件的OnStart事件下编写START按钮的click事件代码(以自动启动和停止服务器)

特定问题的答案是否。由于“开始”按钮位于用户应用程序中,因此单击的事件将在该应用程序中触发和处理,而不是在Windows服务中

为了从用户应用程序控制Windows服务,必须使用某种进程间通信(IPC)。这很有道理,对吧?正如我已经说过的,应用程序中的事件对于服务来说甚至都是不可见的,因为它们是两个不同的进程。这就是IPC的作用。当用户与应用程序交互时,交互被转换为命令,这些命令通过IPC机制发送给服务,以便服务可以执行命令所指示的逻辑。同样,服务的结果可以通过IPC机制发送到应用程序,以便向用户显示

有各种各样的IPC机制—套接字、远程处理、管道、共享内存等。对于基于.NET的软件,建议使用以下方法。简而言之,WCF允许您定义特定于您的用途的编程API,以便在多个应用程序域之间交换信息。本质上,您只需调用一个方法即可交换数据。从开发人员的角度来看,它只是一个函数调用。信息打包和发送到其他应用程序域的方式取决于WCF管道的配置方式。想使用插座吗?想用水管吗?想使用HTTP吗?所有这些选项(以及更多)都可以通过简单地更改WCF配置来获得

我已经成功地使用了WCF,但是学习曲线确实很陡峭。事实上,出于性能方面的原因,我已经退回使用套接字作为IPC机制。尽管如此,WCF还是值得一看,因为您不必担心所选IPC机制的复杂性。我已经回答了另一个关于这个的问题。这应该让你开始


HTH

为什么要使用桌面应用程序进行此操作?除了“开始”和“停止”按钮外,UI上还有更多的输入字段。所以只有启动和停止应该由windows服务控制。你完全错了。您的服务应自行建立连接。不是你的桌面程序。然后,您的桌面程序应该向服务发送命令。服务不需要与桌面交互。@AndrewBarber,恕我直言,让应用程序和服务相互交互是有正当理由的。我从事的项目就是这样做的。请重新打开问题,以便我提供答案。@matt Oh yes;他们肯定可以互动。Services.msc和net就是这样做的例子。服务甚至可以与桌面进程交互,但这不是一个好主意。根据OP的说法,最好将功能移动到服务中,并仅使用桌面应用程序进行控制。在按钮单击事件中,我有一个start()方法,该方法反过来调用我的类库中的函数。因此,如果我与win service project共享类库,并在我的服务中调用此start()方法,是否有意义?如果您询问从UI调用
start()
方法是否仅通过引用服务中包含
start()
方法的程序集,就会触发服务中的某些内容,答案是否定的。这就是IPC的必要性。但是,服务当然可以自动调用
start()
方法,但是以这种方式共享代码并不能促进进程之间的通信。我希望这能回答你的问题。