2

我有一些使用System.Drawing.Printing命名空间打印文档的代码。现在需要将其移动到 Windows 服务中。该文档指出这是不可能的,这将支持我迄今为止的发现(因为它不起作用)。我正在假设我可以通过使用System.Printing命名空间来让它工作。

这是我到目前为止的代码:

private Metafile myDoc;

myDoc = GetEmfDoc();

PrintServer ps = new PrintServer("\\server1\printer1");
EnumeratedPrintQueueTypes[] flags = { EnumeratedPrintQueueTypes.Local };
PrintQueueCollection queues = ps.GetPrintQueues(flags);

PrintQueue pq = queues.First<PrintQueue>();                
pq.AddJob("JobName", ?);

所以我想传递myDocpq.AddJob(),但这似乎是不可能的。使用System.Drawing.Printing它可以在事件中简单地逐页呈现PrintDocument.PrintPage

我正在尝试做的事情是否可能,如果是这样,有人可以指出我正确的方向吗?

4

3 回答 3

3

不支持在 Windows 服务或 ASP.NET 应用程序或服务中使用 System.Drawing.Printing 命名空间中的类。尝试从这些应用程序类型之一中使用这些类可能会产生意想不到的问题,例如服务性能下降和运行时异常。

在这种情况下,了解“不支持”的含义很重要。它的字面意思是它所说的,如果您尝试从服务打印并发现问题,那么您无法致电 Microsoft 支持并寻求帮助。

不是System.Drawing 引起的问题,而是打印机驱动程序的一般问题。由打印机制造商而非 Microsoft 提供的代码块。它们的一个重要问题是它们总是被设计为从桌面程序中使用。Word、Acrobat 等。他们很容易利用这一点,他们经常弹出一个窗口让你知道他们正在努力。至少不要向制造商发送垃圾邮件并提醒您碳粉盒是半空的。这些驱动程序可能在服务中行为不端。注释中提到的“运行时异常”短语。

他们最糟糕的问题是他们使用弹出窗口让您知道有问题。当您使用服务中的打印机驱动程序时,这些窗口不可见。因此,您将不得不处理无缘无故拒绝打印的打印作业。注释中的“服务性能下降”短语。这很难处理,当 IT 人员看不到任何诊断时,他们无能为力解决问题。

你的方法不能解决这个根本问题。如果您真的想这样做,请联系打印机制造商并寻求具体建议。不要抱太大希望,从硬件公司那里得到好的答案是相当困难的。

于 2012-04-15T18:00:03.933 回答
1

这是权限问题和 Session 0 隔离的组合...

尽管我不建议这样做,但以下可能会解决您面临的问题:

如果您真的想要/需要完成这项工作,您将需要server1从会话 0 内部(不是从“正常”用户会话)登录(事先!)到远程服务器(在您的示例中) - 以交互方式(您可以通过 ) 或通过一些调用切换到会话 0 桌面rundll32 winsta.dll,WinStationSwitchToServicesSession(例如,使用WNetAddConnection2远程计算机的正确凭据,不幸的是,这只能通过 p/invoke 或 COM 使用从 .NET 使用WScript.Network)。用于此登录的凭据需要具有有关在远程计算机上打印的完全权限。

于 2012-04-14T07:46:45.570 回答
0

您是否在具有使用打印机的必要权限的帐户中运行您的服务?Windows 服务常见问题解答中的更多详细信息。

于 2012-04-11T13:55:08.837 回答