背景
我正在使用.NET 4.0在C#中编写应用程序。它按特定顺序打印一堆文档。这些文件有各种不同的类型,实际上是使用带有“print”动词的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组件。)
似乎每次我开始一个项目时我都会遇到同样的混乱:对本机函数,COM东西等的各种调用等。
次要问题:对于.NET理念或实现,我是否缺少一些东西? (我是不是觉得托管库做得不够好?对于任何需要执行Windows特定事情的操作,如果操作打印队列,.NET是错误的选择吗?)我得到(或者我认为) .NET在理论上应该是独立于操作系统的......但是大多数现代操作系统肯定都有打印机和打印队列等等。 (因此,如果您有执行这些类型的通用调用,则可以在每个平台的框架版本上实现它们。)
答案 0 :(得分:6)
主要问题:查看PrintQueue命名空间中的LocalPrintServer和System.Printing类。
次要问题:.NET没有被编写为独立于操作系统(没有Mono),它被编写为独立于Windows版本。虽然处理托管对象和托管调用会很好,但我认为这是一种有点不切实际的期望。 Windows公开的现有C和COM功能的庞大规模和数量使得所有包装成为一项艰巨的任务。虽然我确信微软在工资单上有大量的开发人员,但我认为,考虑到相对容易使用的COM& C,这项工作的投资回报率相当低。 P / Invoke支持。