【发布时间】:2010-09-15 18:02:48
【问题描述】:
如何在 .Net DLL 中确定它是在 Windows GUI 应用程序还是 Web 服务中运行?我有一个在两个应用程序之间共享的低级类,并且需要在 Web 服务中使用它时禁用消息框。
Windows 应用程序有 200 多个解决方案,我无法重构现有代码。 Web 服务需要重用某些功能,我正在寻找快速解决方案。
【问题讨论】:
标签: .net web-services user-interface dll
如何在 .Net DLL 中确定它是在 Windows GUI 应用程序还是 Web 服务中运行?我有一个在两个应用程序之间共享的低级类,并且需要在 Web 服务中使用它时禁用消息框。
Windows 应用程序有 200 多个解决方案,我无法重构现有代码。 Web 服务需要重用某些功能,我正在寻找快速解决方案。
【问题讨论】:
标签: .net web-services user-interface dll
如果它在 web 上下文中运行,则 HttpContext.Current 不会为空。
【讨论】:
只是一条一般建议,您的低级类可能不应该使用消息框本身,而应该允许中间(更接近界面)类来处理您可能需要消息框的情况。
如果您这样做了,那么您只需为网络使用与桌面不同的更高级别的类,并且每个类都将具有适合其上下文的通知工具。
【讨论】:
我不知道这是否会奏效,但它可能会。使用这些 Win32 调用:
GetModuleFileNameEx 获取 dll 的 exe 并保存以供以后比较。
EnumWindows 获取所有顶级窗口。
GetWindowModuleFileName 将窗口句柄从 EnumWindows 转换为模块名称。
如果您可以在 GetWindowModuleFileName 的结果中找到您自己的 exe,那么您的 dll 正在 GUI 应用程序中运行。
【讨论】:
您可以使用Environment.UserInteractive 属性。
UserInteractive 属性报告 对于 Windows 进程或 像 IIS 这样的服务在没有 用户界面。如果这个属性是 false,不显示模式对话框或 消息框,因为没有 用户的图形用户界面 互动。
我知道您无法做到这一点,但是....您可能还想考虑一下您的应用程序设计。
【讨论】: