背景:
我正在使用 .NET 4.0 在 C# 中编写应用程序。它按特定顺序打印一堆文档。这些文档有各种不同的类型,实际上是使用带有“打印”动词的 ShellExecute 打印的。
为确保订单不会困惑,我想检查相关打印机的打印队列。我的主循环看起来像:
- 对文档调用“打印”操作
- 等待文档出现在打印队列中
- 重复直到完成
如何使用托管代码监控打印队列?
我发现了一些使用非托管调用(如:http://blogs.msdn.com/b/martijnh/archive/2009/08/05/printmonitor-a-c-print-spooler-monitor.aspx)做类似事情的很好的例子。此外,我知道如何查看 c:\windows\system32\spool... 下的假脱机文件并以这种方式解决问题。
但是,这些解决方案都不是很令人满意……我调用大量非托管鳕鱼,我觉得我应该只用 C++ 编写应用程序。 (并且没有 .NET 依赖项/开销。)
主要问题:真的没有办法仅使用托管调用来监控打印队列吗?
更一般的问题:我来自 Java 世界,通常只在我想做特定于操作系统的事情或需要与 MS 世界中的其他事物交互的事情时才使用 .NET 语言。 (例如 SSIS 组件。)
似乎每次我开始一个项目时,我都会陷入同样的困惑:对 native 函数、COM 等的各种调用,等等。
次要问题:关于 .NET 理念或实现,我是否遗漏了什么? (我只是没有足够努力地寻找托管库来做事吗?对于需要执行特定于 Windows 的操作(例如操作打印队列)的任何事情,.NET 是错误的选择吗?)我明白了(或者我认为我明白了) .NET 在理论上应该是独立于操作系统的。但是大多数现代操作系统肯定都有打印机和打印队列以及类似的东西。 (因此,如果您有执行此类操作的通用调用,它们可以在每个平台的框架版本上实现。)
最佳答案
主要问题:看一下 PrintQueue和 LocalPrintServer System.Printing 中的类命名空间。
第二个问题:.NET 并不是为了独立于操作系统(没有 Mono)而编写的,它是为了独立于 Windows 版本而编写的。虽然只处理托管对象和托管调用会很好,但我认为这是一个有点不切实际的期望。 Windows 公开的现有 C 和 COM 函数的绝对大小和体积使得包装一切成为一项艰巨的任务。虽然我确信微软有大量的开发人员在工作,但我会说,考虑到相对易于使用的 COM 和 P/Invoke 支持,这样一项工作的投资返回率非常低。
关于c# - 在不使用互操作/非托管代码的情况下监视打印假脱机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9022882/