0

我有一个带有 c# (.net 4) 的小服务,主要检测会话更改,例如计算机锁定和解锁,并向后端 sql 2014 express 服务器报告。

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

关于应用程序/服务创建和通信的教程或概述,谁能指出我的方向?这是 WCF 的事情吗?应用程序和服务是否应该在同一个项目中?

感谢您的洞察力!

4

2 回答 2

2

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

我的选择是使用 Windows 服务应用程序中托管的 WCF 服务。有很多关于自托管 WCF 服务的示例(这里有一个,尽管我没有全部阅读)。

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

请注意 #2:创建 Windows 服务以在Environment.UserInteractive == true. 为此,我倾向于修改Main方法以启动服务,或使用创建 Windows 窗体应用程序(Application.Run(new SomeForm())等)时找到的代码启动 GUI。这使调试变得容易得多。


为避免混淆:我不是在谈论创建用户交互服务!我说的是制作您的服务应用程序,以便它既可以作为服务运行,也可以作为调试应用程序运行。像这样,例如:

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从表单的OnLoad处理程序和DoStop表单的处理程序调用OnClose

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

这样,您就可以从 Visual Studio 运行您的服务应用程序,而不会出现“A 服务不能作为应用程序运行”消息。

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

于 2015-03-31T12:34:38.127 回答
1

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

除此之外的任何事情都需要更精细的方法,通常使用IPC,写入相同的数据库和/或回调 Web 应用程序......

没有必要让服务和windows客户端在同一个项目中。但是,您可以在一处定义服务名称会很好,因为您的系统托盘应用程序需要服务名称才能与您的服务交互。

是否将这两个项目放在一起是您的决定,但请记住您的应用程序和服务之间的关系。如果没有该服务,您的应用程序能否独立存在?如果有人更新服务而没有意识到他们还需要更新另一个项目中的另一个应用程序,那就不好了。

于 2016-01-18T10:01:33.920 回答