8

背景:

我正在使用 .NET 4.0 在 C# 中编写应用程序。它以一定的顺序打印一堆文档。这些文档是所有不同类型的,实际上是使用带有“打印”动词的 ShellExecute 打印的。

为确保订单不会混乱,我想检查所涉及打印机的打印队列。我的主循环看起来像:

  1. 在文档上调用“打印”操作
  2. 等待文档出现在打印队列中
  3. 重复直到完成

如何使用托管代码监控打印队列?

我发现了一些使用非托管调用做类似事情的好例子(比如:http: //blogs.msdn.com/b/martijnh/archive/2009/08/05/printmonitor-ac-print-spooler-monitor.aspx)。另外,我知道如何查看 c:\windows\system32\spool... 下的假脱机文件并以这种方式解决问题。

但是,这些解决方案都不是很令人满意......我打电话给大量非托管鳕鱼,我觉得我应该只用 C++ 编写应用程序。(并且没有 .NET 依赖项/开销。)

主要问题:真的没有办法只使用托管调用来监控打印队列吗?

更一般的问题:我来自 java 世界,通常只在我想做一些特定于操作系统的事情或需要与 MS 世界中的其他事物交互的事情时才使用 .NET 语言。(例如 SSIS 组件。)

似乎每次我开始一个项目时,我都会陷入同样的​​混乱:对本机函数、COM 内容等的各种调用。

第二个问题:关于 .NET 理念或实现,我是否遗漏了什么?(我只是没有足够努力地让托管库做事吗?对于需要执行 Windows 特定操作(例如操作打印队列)的任何事情,.NET 是错误的选择吗?) 我明白(或认为我明白).NET 是理论上应该是独立于操作系统的……但大多数现代操作系统肯定都有打印机和打印队列之类的东西。(因此,如果您对做这些事情有通用调用,它们可以在每个平台的框架版本上实现..)

4

1 回答 1

6

主要问题:查看System.Printing命名空间中的PrintQueueLocalPrintServer类。

第二个问题:.NET 不是为独立于操作系统(无 Mono)而编写的,它被编写为独立于 Windows 版本。虽然只处理托管对象和托管调用会很好,但我认为这是一个有点不切实际的期望。Windows 公开的现有 C 和 COM 函数的庞大规模和数量使得封装所有内容成为一项艰巨的任务。虽然我确信微软有大量的开发人员在工资单上,但考虑到相对容易使用的 COM 和 P/Invoke 支持,我想说这样一项事业的投资回报率很低。

于 2012-01-26T18:40:57.633 回答