2015-03-31 93 views
0

我有一个c#(.net 4)的小型服务,主要检测会话更改,如计算机锁定和解锁并报告到后端SQL 2014 Express服务器。Windows服务Systray应用程序

我想添加一个系统托盘应用程序,它将与服务/后端进行交互以捕获更多数据并与登录用户进行一些交互。

任何人都可以指向我的方向尽可能的教程或应用程序/服务创建和通信的概述?这是一个WCF的东西?应用程序和服务应该在同一个项目中吗?

感谢您的洞察!

+0

您应该接受一个答案 – 2016-03-28 22:55:06

+0

可能的重复[如何显示C#窗口服务的系统托盘图标?](http://stackoverflow.com/questions/2652254/how-can-i-display-a -system-tray-icon-for-c-sharp-window-service) – 2016-03-28 22:56:00

回答

1

您可以将两个项目放在同一个解决方案中。有很多选项可以与您的服务进行交互。最好的选择取决于您希望UI应用程序使用该服务执行的操作。

我的选择是使用托管在您的Windows服务应用程序中的WCF服务。有很多自托管WCF服务的例子(其中一个是here,虽然我没有看完)。

请注意#1:要将服务引用添加到客户端,您需要在Visual Studio外启动主机,以防两个项目处于相同的解决方案中,因为“添加服务引用”菜单项不会在Visual Studio中运行时可用。

请注意#2:在Environment.UserInteractive == true时,创建您的Windows服务作为GUI应用程序运行可能是个好主意。为此,我倾向于修改Main方法以启动服务,或者使用创建Windows Forms应用程序时发现的代码(Application.Run(new SomeForm())等)启动GUI。这使得调试lot更容易。


为了避免混淆:我谈论的是创建一个用户交互的服务!我正在讨论如何制作服务应用程序,以便它既可以作为服务运行,也可以作为应用程序进行调试。与此类似,例如:

static void Main(string[] args) 
{ 
    if (Environment.UserInteractive) 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new DebugForm(new MyService())); 
    } 
    else 
    { 
     ServiceBase[] ServicesToRun; 
     ServicesToRun = new ServiceBase[] { new MyService() }; 
     ServiceBase.Run(ServicesToRun); 
    } 
} 

添加新的方法DoStart()DoStop()到您的服务类,只需要调用OnStartOnStop模拟正在启动该服务。从窗体的处理程序中调用DoStart,并从窗体的OnClose处理程序中调用DoStop

当然,您需要添加System.Windows.FormsSystem.Drawing引用您的项目以允许使用表单。

通过这种方式,您可以直接在Visual Studio中运行服务应用程序,而无需“服务无法作为应用程序运行”消息。

您仍然需要创建一个UI应用程序来与服务交互!以上内容仅对调试服务有所帮助,并且是我爱上的东西,因为它使开发更容易!

+1

嗨Thorsten,感谢您的信息。我想要应用程序部分的原因是因为从我读过的所有内容来看,用户交互式服务是一个不错的选择,并且从Windows Vista/7开始不再支持。 – FLAdmin 2015-03-31 12:43:17

+0

您好Thorsten,感谢您的信息。我想要应用程序部分的原因是因为从我读过的所有内容来看,用户交互的服务是一个不错的选择,以及从Windows Vista/7开始不再支持。 – FLAdmin 2015-03-31 12:43:19

+0

哦!用户交互式服务*不再可能*。你误会我了!我的意思是:如果'Environment.UserInteractive == false'修改你的服务program.cs,以便它作为一个服务运行,并启动一个正常的应用程序**仅仅用于调试**如果'Environment.UserInteactive == true'!这与运行用户交互的服务无关! – 2015-03-31 12:45:15

1

如果您只需要与服务进行基本交互(启动/停止/重新启动/状态...),则ServiceController将为您提供足够的实用程序。

什么比这更需要一个更复杂的方法,通常使用IPC,写入同一个数据库和/或回调到Web应用程序...

没有必要有服务和Windows客户端在同一个项目中。不过,您可以在一个地方定义您的服务名称,因为您的系统托盘应用程序需要服务名称才能与您的服务进行交互。

把这两个项目放在一起或不是你的电话,但要记住你的应用程序和你的服务之间的关系。没有服务,您的应用程序可以独立运行吗如果有人更新服务而不意识到他们还需要更新另一个项目中的另一个应用程序,那就不太好了。