Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Windows或ASP.NET服务中的系统绘图_C#_.net_Windows Services_System.drawing - Fatal编程技术网

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

C# Windows或ASP.NET服务中的系统绘图,c#,.net,windows-services,system.drawing,C#,.net,Windows Services,System.drawing,根据,在Windows服务或ASP.NET服务中使用System.Drawing命名空间中的类不是一个特别好的主意。现在我正在开发一个类库,它可能需要访问这个特定的名称空间(用于测量字体),但不能保证主机进程不是服务 现在,如果System.Drawing不可用,我可以使用一种不太理想的方法,但如果可能,我宁愿使用System.Drawing中的类。所以我想做的是在runtume上确定System.Drawing是否安全,如果安全,就使用它,否则返回到次优选项 我的问题是:我怎么可能检测到Sys

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

现在,如果System.Drawing不可用,我可以使用一种不太理想的方法,但如果可能,我宁愿使用System.Drawing中的类。所以我想做的是在runtume上确定System.Drawing是否安全,如果安全,就使用它,否则返回到次优选项

我的问题是:我怎么可能检测到System.Drawing是否可以安全使用?

我想我也应该

  • 检测当前进程是Windows服务还是ASP.NET服务
  • 检测GDI是否可用
  • 或者有一种方法可以询问System.Drawing.dll本身是否可以安全使用
不幸的是,我无法想出一种方法来实现这些方法中的任何一种。有人知道吗?

你可以用它来代替。我知道在ASP.NET中使用System.Windows.Forms中的某些内容很奇怪,但在ASP.NET中不受支持的情况下,它似乎没有同样的警告。我使用TextRenderer和Graphics.MeasureString来测量ASP.NET应用程序中的字符串,因此它们都可以工作。我从来没有看到过关于系统的警告。在ASP.NET中绘图是不可取的


TextRenderer比Graphics.MeasureString,FWIW慢得多。

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

只需在应用程序中的引用上单击鼠标右键,然后将“复制本地”的选项更改为“真”


我可能误解了这个问题…

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


-Oisin

为了消除任何混乱,System.Drawing在ASP.NET和Services下都可以工作,只是不支持。可能存在高负载(非托管资源耗尽)、内存或资源泄漏(实施不当或称为dispose模式)和/或在没有桌面显示对话框时弹出对话框的问题

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

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

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

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

我认为应该有一种托管或p/invoke方式来查找桌面(我认为这实际上是所有这些的定义因素)和/或AppDomain之外的东西,这将为您提供线索。但我不确定它是什么,MSDN对此也没什么启发性

编辑:在浏览MSDN时,我记得它实际上是一个主机(它承载一个桌面),这是这里最重要的一点。有了这些信息,我就能够找到返回当前窗口站句柄的窗口。如果您有一个可见的桌面,将该句柄传递给将获得一个结构,该结构应该有一个WSF_可见的dwFlags

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

但是,是的,我仍然认为让应用程序设置一个属性或其他东西是更容易的方法


再次编辑:7年后,我了解了上面我为您描述的MS的位置……我仍然建议授权给托管应用程序(他们可能希望使用更快但风险稍高的系统。绘制路径),但UserInteractive似乎是一个很好的默认设置,无需使用它,您自己也可以使用它。

即使没有官方支持,多年来,我一直在高容量的web服务器(包括web应用程序和web服务)上广泛使用System.Drawing类,而不会导致任何性能或可靠性问题


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

为什么需要检查与字体相关的内容?据我所知,windows服务没有UI。请帮助理解原因。无需详细说明,此类库将生成报告,主机进程可能会通过电子邮件发送这些报告。其中一个函数需要测量字符串的渲染宽度。关键是,它可能会显示在其他计算机上,而不是服务器本身。我发现GDI+(System.Drawing)使用起来是安全的,只要您正确地处理了所有一次性对象,并进行了正确的错误处理,并且。随着10K-60K网站的运行,尚未出现任何与系统相关的稳定性问题。绘图使用。然而,除非正确使用System.Drawing,否则很容易产生稳定性问题