不使用互操作/非托管代码监视打印假脱机

背景:

我正在使用.NET 4.0在C#中编写应用程序。 它按特定顺序打印一堆文档。 这些文档有各种不同的类型,实际上是使用带有“print”动词的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世界,当我想要做一些特定于OS的事情或者需要与MS世界中的其他事物进行交互时,通常只使用.NET语言。 (例如SSIS组件。)

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

次要问题:对于.NET哲学或实现,我是否缺少一些东西? (我是不是觉得托管库做得不够好?对于任何需要执行Windows特定操作的东西,例如操纵打印队列,.NET是错误的选择吗?)我得到(或者我认为)得到的.NET是理论上应该是独立于操作系统的……但是大多数现代操作系统肯定都有打印机和打印队列等等。 (所以如果你有做这些事情的generics调用,它们可以在每个平台的框架版本上实现..)

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

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