【问题标题】:How to deterimine whether .Net DLL is used in a GUI app or web service?如何确定 .Net DLL 是否用于 GUI 应用程序或 Web 服务?
【发布时间】:2010-09-15 18:02:48
【问题描述】:

如何在 .Net DLL 中确定它是在 Windows GUI 应用程序还是 Web 服务中运行?我有一个在两个应用程序之间共享的低级类,并且需要在 Web 服务中使用它时禁用消息框。

Windows 应用程序有 200 多个解决方案,我无法重构现有代码。 Web 服务需要重用某些功能,我正在寻找快速解决方案。

【问题讨论】:

    标签: .net web-services user-interface dll


    【解决方案1】:

    如果它在 web 上下文中运行,则 HttpContext.Current 不会为空。

    【讨论】:

      【解决方案2】:

      只是一条一般建议,您的低级类可能不应该使用消息框本身,而应该允许中间(更接近界面)类来处理您可能需要消息框的情况。

      如果您这样做了,那么您只需为网络使用与桌面不同的更高级别的类,并且每个类都将具有适合其上下文的通知工具。

      【讨论】:

      • 这就是答案。重构库类中的所有消息框用法。调用者有责任解释结果并通知用户。
      【解决方案3】:

      我不知道这是否会奏效,但它可能会。使用这些 Win32 调用:

      GetModuleFileNameEx 获取 dll 的 exe 并保存以供以后比较。
      EnumWindows 获取所有顶级窗口。
      GetWindowModuleFileName 将窗口句柄从 EnumWindows 转换为模块名称。

      如果您可以在 GetWindowModuleFileName 的结果中找到您自己的 exe,那么您的 dll 正在 GUI 应用程序中运行。

      【讨论】:

        【解决方案4】:

        您可以使用Environment.UserInteractive 属性。

        UserInteractive 属性报告 对于 Windows 进程或 像 IIS 这样的服务在没有 用户界面。如果这个属性是 false,不显示模式对话框或 消息框,因为没有 用户的图形用户界面 互动。

        我知道您无法做到这一点,但是....您可能还想考虑一下您的应用程序设计。

        【讨论】:

        • 但是请注意,这个 Environment.UserInteractive 将适用于任何“与显示器相关联”的应用程序。这还包括控制台应用程序(当然也可以显示消息框 - 但您可能不希望这样)。
        • 还有 HttpContext.Current,在这种情况下将为空。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-22
        • 1970-01-01
        • 2018-07-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多