背景:
我正在使用 .NET 4.0 用 C# 编写一个应用程序。它按一定顺序打印一堆文档。这些文档具有不同的类型,并且实际上是使用 ShellExecute 和“print”动词打印的。
为了确保顺序不会混乱,我想检查相关打印机的打印队列。我的主循环如下所示:
- 对文档调用“打印”操作
- 等待文档出现在打印队列中
- 重复直到完成
如何使用托管代码监控打印队列?
我发现了一些使用非托管调用执行类似操作的好例子(例如: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 理论上应该是独立于操作系统的。但是大多数现代操作系统肯定都有打印机和打印队列之类的东西。 (因此,如果您有执行此类操作的通用调用,则可以在每个平台的框架版本上实现它们。)
主要问题:看一下打印队列 and 本地打印服务器类中的系统打印命名空间。
第二个问题:.NET 并不是为了独立于操作系统而编写的(没有 Mono),而是为了独立于 Windows 版本而编写的。虽然只处理托管对象和托管调用会很好,但我认为这是一个有点不切实际的期望。 Windows 公开的现有 C 和 COM 函数的绝对大小和数量使得包装一切这是一项艰巨的任务。虽然我确信微软拥有大量的开发人员,但我想说,考虑到相对容易使用的 COM 和 P/Invoke 支持,这样的事业的投资回报率相当低。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)