用 C# 编写驱动程序

Posted

技术标签:

【中文标题】用 C# 编写驱动程序【英文标题】:Writing drivers in C# 【发布时间】:2010-11-02 22:27:48 【问题描述】:

我之前用 C/C++ 编写过,但目前我需要将其转换为 C#。

谁能告诉我如何的代码/方式?

实际上,目前我用 C++ 编写的旧应用程序存在一些问题,我们必须用 C# 编写 LPT1、COM 打印机和其他 USB 驱动程序的驱动程序。

【问题讨论】:

我听说现在写驱动最好的语言是 javascript(讽刺) 你能分享一些链接吗? 即使您能够使用 C#,驱动程序开发的本质也需要 C++ 技能,并且所有涉及的代码都与 C 相关,可能与汇编相关(指针、段、分页等),C# 太高了水平。 【参考方案1】:

实际上,如果您使用 UMDF,您可以在 C# 中编写一些驱动程序,因为它在用户模式下运行(请参阅Getting Started with UMDF)。但我的建议是使用 C/C++。

【讨论】:

该链接不再直接指向 UMDF,而且我的 Google-fu 没有显示任何内容表明您现在可以用 C# 编写用户模式驱动程序。 @Oran:谢谢,我已经更新了链接。我认为 C# 不用于 UMDF,因为 Microsoft 不提供开箱即用的支持,您需要自己做很多事情(声明函数、常量、结构等)。 2019 年更新:docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/…。 “基于 UMDF 的客户端驱动程序被实现为进程内 COM 服务器 (DLL),而 C++ 是为 USB 设备编写客户端驱动程序的首选语言。”【参考方案2】:

只是你不能。 C# 生成由虚拟机 (.NET) 解释的中间语言。所有这些东西都在用户模式下运行,而 WDM 驱动程序在内核模式下运行。

有一个 DDK,但 VStudio 也不支持它(但你可以制作一个 makefile 项目进行编译)。

驱动程序开发很复杂,容易出现蓝屏,需要对 C、内核结构和内存操作有很好的理解。 C# 和 .NET 不需要这些技能,因此培训路径漫长而痛苦。

【讨论】:

考虑到代码必须在执行前进行签名,如果代码是 JITted 的话,也不能制作一个签名的驱动程序(尽管 IL 可能是)。 (在 Xbox 360 上,与本机代码游戏相反,所有 XNA/.NET 代码都在用户空间运行,因此显然微软对此没有“解决方案”)。不过,有些 C# 操作系统的驱动程序是用 C# 完成的,非常简洁。 并非 Windows 上的所有设备驱动程序都需要内核模式才能运行。视频驱动程序,我相信音频驱动程序,现在在 Windows Vista 和 Windows 7 中都在用户模式下运行。现在微软还提供了一个用户模式驱动程序框架。请注意确定它是否适用于 .NET,可能仍然基于 C/C++。 microsoft.com/whdc/driver/wdf/UMDF.mspx 这是一个用C#写的Wi-Fi Adapter驱动github.com/ixy-languages/ixy.cs【参考方案3】:

您不能在 C# 中编写内核模式驱动程序(运行时在用户模式下执行,因此您无法进入 ring0)。此 SO Q/A 提供了一些您可能会觉得有帮助的链接:

C# driver development?

【讨论】:

【参考方案4】:

从您的描述中不清楚您是打算开发 Windows 设备驱动程序还是通过现有设备驱动程序与硬件交互。

例如,要与连接到您的串口的设备进行交互,您不需要编写自己的驱动程序,实际上,您可以通过 .NET 的SerialPort 类访问它。

甚至可以通过libusb-win32、WinUSB 等框架从用户空间(以及最终的托管代码)访问 USB 设备。

【讨论】:

【参考方案5】:

你不能用 C# 编写驱动程序;驱动程序需要以提升的权限运行才能与硬件通信;托管代码无法在适当的环境中运行。

【讨论】:

否则有什么办法可以处理我之前的C#代码吗? 好吧,我们真的不知道你的代码是做什么的。您是在谈论用 C# 编写设备驱动程序,这是不可能的(如前所述),还是在谈论在 C# 中打开设备并向它们发送数据(这应该是可能的,因为您应该能够将它们作为文件打开并且只需读取/写入句柄)。

以上是关于用 C# 编写驱动程序的主要内容,如果未能解决你的问题,请参考以下文章

CSharpGL(11)用C#直接编写GLSL程序

使用安装程序和部署以及安装程序类卸载用 c# 编写的应用程序

求助: 用C#编写的winform窗体程序

用C#编写百度地图Android手机应用程序(第4讲)

如何用C#编写程序监测某个文件夹内是不是有文件进行了增,删,改的动作?

用C#编写百度地图Android手机应用程序(第3讲)