【问题标题】:Why can't I use a UI component (Windows form) inside of a Windows service?为什么我不能在 Windows 服务中使用 UI 组件(Windows 窗体)?
【发布时间】:2010-07-20 21:16:57
【问题描述】:
我看过几篇文章,基本上都声明 UI 组件不应该作为服务运行。我理解没有人可以响应 UI 事件等的合理性。但事实仍然是许多自动化任务只能通过 Windows 表单实现。
这里有几个很好的例子:
我想构建一个 url 爬虫
制作缩略图的服务
网页。目前我唯一的方法
看到实现这一目标是尝试和
自动化 .Net WebBroswer
组件。
自动打印 MS-Word
文档。
Vista 之前有一些技巧可以解决这个问题,但现在没有了。我的问题是为什么会出现这种情况,人们真的有什么选择?
【问题讨论】:
标签:
winforms
windows-services
automation
【解决方案1】:
查找Shatter Attacks 和Session 0 Isolation Feature。
基本上,如果两个进程(不同用户的)共享同一个桌面,一个进程可能会通过发送 Windows 消息在另一个进程中执行它想要的任何代码,这被称为 Shatter Attack。
关于这是否是设计错误引起了很多讨论,在 Vista 之后,微软决定删除对服务的任何交互式桌面支持,因为这是一个潜在的安全漏洞。
作为替代方案,您可以考虑以有权访问交互式桌面的登录用户身份运行图像生成/打印代码。
【解决方案2】:
就像白痴所说,最好的办法是不要将其作为服务运行。
但是也许您仍然无法从服务中运行它,因为您需要从某种现有的框架中运行您的代码。
因此,解决方法是编写一个以登录用户身份运行的服务器程序。您将从必须所在的代码中访问该服务器程序一项服务。服务器将完成工作并返回结果。
您可以使用 WCF 在命名管道上作为传输或任何有效的方式在 2 之间进行通信。如果没有,您可以使用裸命名管道,或者 localhost 上的 tcp/ip。从您的用户资料中的网站来看,您应该了解 localhost!
【解决方案3】:
从技术上讲,UI 组件需要启动 Windows 消息队列才能工作。您可以从 Windows 服务运行它(可能允许与桌面交互,据我所知,此功能在 Windows Vista 及更高版本中被禁用)。
但是你说的不是 UI 组件,而是 COM 组件,你可以使用它。至少是 MS Office,但微软不推荐,因为内存泄漏是可能的。最新的 MS Office 有服务器版本,可以在没有用户界面的应用程序中使用。