我有一个c#(。net 4)的小服务,它主要检测会话更改,例如计算机锁定和解锁,并向后端sql 2014 express服务器报告。
我想添加一个系统托盘应用程序,它将与服务/后端交互以捕获更多数据并与登录用户进行一些交互。
任何人都可以指向我的方向,直到应用程序/服务创建和通信的教程或概述?这是WCF吗?应用程序和服务应该在同一个项目中吗?
感谢您的见解!
答案 0 :(得分:2)
您可以在同一解决方案中同时拥有这两个项目。有许多选项可以与您的服务进行交互。最佳选择取决于您希望UI应用程序对服务执行的操作。
我的选择是使用Windows服务应用程序中托管的WCF服务。有许多自托管WCF服务的例子(一个是here,虽然我没有全部阅读。)
请注意#1:要将服务引用添加到客户端,您需要在Visual Studio外部启动主机,以防两个项目都位于同一解决方案中,因为“添加服务引用”菜单项将不可用在Visual Studio中运行时。
请注意#2:在Environment.UserInteractive == true
时创建Windows服务以便能够作为GUI应用程序运行可能是个好主意。为此,我倾向于修改Main
方法以启动服务,或使用创建Windows窗体应用程序(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()
,只需调用OnStart
和OnStop
即可模拟正在启动的服务。从表单的DoStart
处理程序调用{{1}},从表单的OnLoad
处理程序调用{{1}}。
当然,您需要向项目添加DoStop
和OnClose
引用,以允许使用表单。
通过这种方式,您可以从Visual Studio运行服务应用程序,而无需“服务无法作为应用程序运行”消息。
您仍然需要创建一个UI应用程序来与服务进行交互!以上只对调试服务有帮助,这是我喜欢的,因为它使开发变得更容易!
答案 1 :(得分:1)
如果您只需要与服务进行基本交互(启动/停止/重启/状态...),ServiceController将为您提供足够的实用程序。
除此之外还需要更复杂的方法,通常使用IPC,写入同一个数据库和/或回调Web应用程序......
没有必要让服务和Windows客户端在同一个项目中。但是,您可以在一个地方定义您的服务名称,这很好,因为您的系统托盘应用需要服务名称来与您的服务进行互动。
将这两个项目组合在一起是您的号召,但请记住您的应用程序与服务之间的关系。您的应用程序可以在没有服务的情如果有人更新服务而没有意识到他们还需要更新另一个项目中的另一个应用程序,那就太好了。