现在有一种不太理想的方法可以回退到,如果System.Drawing不可用,但如果可能的话,我宁愿使用System.Drawing中的类。所以我想做的是在运行时确定System.Drawing是否安全,如果是,就使用它,否则回退到次优选项。
我的问题是:我怎么可能检测System.Drawing是否安全使用?
我认为我应该:
- 检测当前进程是否为Windows Service或ASP.NET服务
- 检测GDI是否可用
- 或者也许有一种方法可以询问System.Drawing.dll本身是否安全使用
编辑: 在恶作剧 MSDN 后,我想起了重要的一点是窗口站(它托管一个桌面)。有了这个信息,我能够找到GetProcessWindowStation(),它返回当前窗口站的句柄。将该句柄传递给GetUserObjectInformation()将会得到一个USEROBJECTFLAGS结构,其中应该有一个具有WSF_VISIBLE的dwFlags,如果你有一个可见的桌面。
或者,EnumWindowsStations将为您提供一个可以检查的工作站列表-WinSta0 是互动的。
但是,是的,我仍然认为让应用程序设置属性或其他东西是更容易的路线...
再次编辑: 7 年后,我发现了 Environment.UserInteractive,其中 MS 为您描述的 GetProcessWindowStation 舞蹈做了完全相同的事情。我仍然建议委托给托管应用程序(他们很可能希望使用更快但稍微有一些风险的System.Drawing路径),但是UserInteractive似乎是一个很好的默认值,而无需自己调用pinvoke。
尽管官方不支持,但我已经在高负载的Web服务器(包括Web应用程序和Web服务)上广泛使用System.Drawing类多年,而且没有引起任何性能或可靠性问题。
我认为确定代码是否安全使用的唯一方法是进行测试、监控,并将任何具有外部资源的对象包装在using{}语句中。
这可能与GDI子系统需要STA线程有关。如果是这种情况,请调查在涉及aspx页面的@PAGE指令中指定ASPCOMPAT=TRUE。这将在STA线程中运行aspx页面,如果我没记错的话。
-Oisin
你可以尝试将 System.Drawing.dll 复制到应用程序的 bin 目录中,然后以这种方式使用它。这可能会保证其可用性。
只需右键单击应用程序中的引用,然后将 Copy Local 选项更改为 true。
不过我可能误解了问题...
System.Windows.Media
命名空间中,没有附加相同的警告。我不知道你是否已经拥有了所需的一切,但我知道你可以使用它将文本呈现为轮廓。无论是更好地使用它还是缺少警告只是一个疏忽,我不知道。 - John