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