使用.NET编写虚拟打印机

32

我想创建一个虚拟打印机,将数据传递给我的.NET应用程序。然后我想创建一个安装程序,安装打印机和.NET应用程序。非常希望能够全部使用C#编写,但我感觉这需要编写未经管理的代码来编写打印机驱动程序。是否有比较清晰的教程或示例可以学习如何完成此操作?

7个回答

12

使用Github项目:Microsoft/Windows-driver-samples/print/XPSDrvSmpl, 可以完全按照您的要求执行。

https://github.com/Microsoft/Windows-driver-samples/tree/master/print/XPSDrvSmpl

安装程序:http://wixtoolset.org/

应用程序:监听内部端口

操作流程:通过一个单一的安装程序安装打印机和应用程序。 当用户使用您的驱动程序打印时,应用程序会监听内部端口。 发送数据时,应用程序将收到通知。该流程适用于XPS,可以转换为PDF,但无论打印什么,流程都类似。 如果需要其他内容,请查看GitHub上的Microsoft / Windows-driver-samples / print /或其他特定于您需求的来源。

更新:

许多关于如何让驱动程序工作的问题,这里有一个快速示例:

首先下载Windows驱动程序工具包(WDK),如果您尚未安装它,请在安装时选择添加Visual Studio的扩展。在Visual Studio 2017安装中,您需要选择 使用C++进行桌面开发, 以获取正确的SDK。如果您没有,请查看下面的答案如何添加它。

如何添加Visual Studio 2017的功能?

https://developer.microsoft.com/en-us/windows/hardware/windows-driver-kit

然后下载Windows-driver-samples主文件夹的 .zip 文件:

https://github.com/Microsoft/Windows-driver-samples/archive/master.zip

请到文件夹<UnzipFolder>\print\XPSDrvSmpl,然后在Visual Studio中打开XPSDrvSmpl.sln。接下来请按照微软在GitHub上的指南进行操作。您可以看到该指南适用于Visual Studio 2015,但我认为它也适用于2017版(尚未测试):
构建使用Windows驱动程序工具包(WDK) 10和Visual Studio 2015的驱动程序解决方案,请按照以下步骤进行操作:
  1. 在Visual Studio 2015中打开解决方案文件。
  2. 将所有非二进制文件(通常位于示例的 \install 目录中)添加到Package项目:a. 在“解决方案资源管理器”中,右键单击“Driver Files”,b. 选择“添加”,然后单击“现有项”,c. 浏览到您下载示例的位置,并选择安装目录中的所有文件,或等效的一组非二进制文件,例如INF、INI、GPD、PPD文件等,d. 单击“添加”。
  3. 将这些文件配置为添加到驱动程序包中:a. 在“解决方案资源管理器”中,右键单击解决方案并选择“添加” > “新建项目”。选择“Visual C++/Windows Driver/Package”下的“Driver Install Package”。b. 在“解决方案资源管理器”中,右键单击“Package”项目并选择“属性”。c. 在左窗格中,单击“配置属性” > “Driver Install” > “Package Files”。d. 在右窗格中,使用省略号按钮(...)浏览到要添加到驱动程序包中的文件集。应该添加在步骤2-c中添加的所有数据文件,除了INF文件。这个配置是基于架构的,因此必须为每个将被构建的架构重复进行此配置,e. 单击“确定”。
  4. 打开INF文件并编辑它以与构建输出相匹配:a. 打开INF文件。b. 在版本部分中,添加对目录文件的引用,如:CatalogFile=XpsDrvSmpl.cat。c. 在SourceDisksFiles部分中,更改您正在构建的DLL文件的位置为=1。这表示没有架构限制。在这个驱动程序中,您需要手动整理驱动程序INF文件,以便在一起运输多个架构。此时,Visual Studio 2015将能够构建驱动程序包并将文件输出到磁盘。为了配置驱动程序签名和部署,请参阅“开发、测试和部署驱动程序”。
    参考链接: https://github.com/Microsoft/Windows-driver-samples/tree/master/print/XPSDrvSmpl#build-the-sample

驱动程序中是否有可用的UTF-8编码选项? - Exorcismus

8

5

您可以将您的应用程序简单地公开,就像LPD类型的打印机或监视器端口9100一样。然后,您可以安装任何喜欢的打印驱动程序,并将其指向您的应用程序。


1
不错的想法。但是对于解析“LPD数据”或通过端口传输的任何内容怎么处理? - bzlm
通常情况下,515端口像大多数其他东西一样,是用户可定义的,但更常见的情况是这样。LPD很好用,因为它有一个小标题,包含目标队列等信息,然后是实际数据。只需捕获一些数据,你就会发现,它非常简单。 - Douglas Anderson

2

0
为什么不考虑使用另一种方法呢?比如使用中间的现成打印程序,例如那些免费提供的Print-to-PDF应用程序。然后你只需要使用一些第三方库(也有免费和开源的变体)来解码PDF,而不是费尽心思地重新发明轮子。还有其他的Print-to-XXX应用程序,你也可以根据你认为合适的格式进行考虑。

0

我认为解释PDF的方法也不是什么好办法。我不知道你为什么想做你想做的事情。也许你正在尝试编写自己的PDF打印机。

我认为你应该真正看看Windows驱动程序开发。如果你想开发打印机驱动程序,我认为你必须使用C++来完成。

祝你好运。


-1
如果我没记错的话,微软不支持在打印机驱动程序开发中使用.NET。我还没有遇到过纯.NET打印机驱动程序。你将是一个非常勇敢的人去这样做!网站“Printer Driver Resource Toolkit”并未说明驱动程序是用.NET编写的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接