代码之家  ›  专栏  ›  技术社区  ›  Tamas Czinege

Windows或ASP.NET服务中的系统绘图

  •  16
  • Tamas Czinege  · 技术社区  · 16 年前

    MSDN ,在 系统图 Windows服务或ASP.NET服务中的命名空间。现在我正在开发一个类库,它可能需要访问这个特定的名称空间(用于测量字体),但不能保证主机进程不是服务。

    我的问题是: 我怎么可能检测到系统图纸是否安全使用?

    • 检测当前进程是Windows服务还是ASP.NET服务
    • 检测GDI是否可用
    • 或者有一种方法可以询问System.Drawing.dll本身是否可以安全使用

    不幸的是,我无法想出一种方法来实现这些方法中的任何一种。有人知道吗?

    5 回复  |  直到 15 年前
        1
  •  19
  •   Community basarat    7 年前

    工作 在ASP.NET和服务下,它不是 支持

    测试将处理后者,监控将提醒您注意前者。但是,如果/当你有问题时,不要期望能够打电话给PSS并要求解决。

    那么,你有什么选择?好吧,如果你不需要一个完全支持的路线,你也不期望极端负载-很多人无视MSDN的警告,成功地使用了System.Drawing。他们中的一些人被咬过,但成功的故事要比失败的故事多得多。

    如果您想获得支持,那么您需要知道您是否以交互方式运行。就我个人而言,我可能会让托管应用程序在某个地方或其他地方设置一个非交互标志。毕竟,应用程序处于最佳位置,可以确定他们是否在托管环境中和/或想要冒GDI+问题的风险。

    但是,如果你想自动检测你的环境,我想有比我们提供的更糟糕的答案 right here on SO 为了服务。总之,您可以检查EntryAssembly以查看它是否继承自ServiceBase,或者尝试访问System.Console。对于ASP.NET,同样,检测HttpContext.Current应该足够了。

    认为

    编辑:浏览MSDN,我记得它实际上是一个 Window Station GetProcessWindowStation() 返回当前窗口站的句柄。把那个把手交给 GetUserObjectInformation() 我会给你一个 USEROBJECTFLAGS

    或者, EnumWindowsStations 将给你一个你可以检查的电台列表-WinSta0是交互式的。

    但是,是的,我仍然认为让应用程序设置一个属性或其他东西是最好的选择

    再次编辑:7年后,我陷入了 Environment.UserInteractive 何女士 does the exact GetProcessWindowStation dance 希望 速度更快,但风险稍高的System.Drawing path),但UserInteractive似乎是一个很好的默认设置,而无需pinvoke自己。

        2
  •  4
  •   Martin Cron    14 年前

    我认为确定代码使用是否安全的唯一方法是使用{}语句测试、监视和包装任何具有外部资源的对象。

        3
  •  1
  •   MusiGenesis    16 年前

    你可以用 TextRenderer

    TextRenderer比Graphics.MeasureString、FWIW慢得多。

        4
  •  0
  •   x0n    16 年前

    这可能与GDI子系统需要STA线程有关。如果是这种情况,请调查在所涉及的aspx页面的@PAGE指令中指定ASPCOMPAT=TRUE。这将在STA线程IIRC中运行aspx页。

    -奥辛

        5
  •  -1
  •   hugoware    16 年前

    您可以将System.Drawing.dll复制到应用程序的bin中,然后以这种方式使用它。这可能会保证它的可用性。

    只需右键单击应用程序中的引用并更改 复制本地 符合事实的