C# 用C编写驱动程序#

C# 用C编写驱动程序#,c#,driver,drivers,C#,Driver,Drivers,我之前用C/C++编写过,但目前需要将其转换为C# 有人能告诉我如何用C语言编写驱动程序的代码/方法吗 实际上,目前我在C++中编写的旧应用程序存在一些问题,我们必须在C语言中编写LPT1、COM打印机和其他USB驱动程序的驱动程序。驱动程序需要以提升的权限运行才能与硬件对话;托管代码无法在适当的环境中运行。您无法在C#中编写内核模式驱动程序(运行时以用户模式执行,因此您无法进入ring0)。本问答提供了一些您可能会觉得有用的链接: 实际上,如果您使用UMDF,您可以用C#编写一些驱动程序,因为

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

有人能告诉我如何用C语言编写驱动程序的代码/方法吗


实际上,目前我在C++中编写的旧应用程序存在一些问题,我们必须在C语言中编写LPT1、COM打印机和其他USB驱动程序的驱动程序。驱动程序需要以提升的权限运行才能与硬件对话;托管代码无法在适当的环境中运行。

您无法在C#中编写内核模式驱动程序(运行时以用户模式执行,因此您无法进入ring0)。本问答提供了一些您可能会觉得有用的链接:


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

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

有一个DDK,但它在VStudio中也不受支持(但您可以创建一个makefile项目进行编译)


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

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

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


甚至USB设备也可以通过诸如等框架从用户空间(以及最终的托管代码)访问。

否则,有没有办法处理我以前用C#编写的代码?嗯,我们真的不知道你的代码是干什么的。您是说用C#编写设备驱动程序,这是不可能的(如前所述),还是说用C#打开设备并向它们发送数据(这应该是可能的,因为您应该能够将它们作为文件打开,并且只读取/写入句柄)。考虑到代码必须在执行之前签名,如果代码是JITted的,则也不可能生成签名驱动程序(尽管IL可能是)。(在Xbox360上,所有XNA/.NET代码都在用户空间中运行,与本机代码游戏相反,因此显然微软对此没有“解决方案”)。不过,有些C#操作系统的驱动程序是用C#编写的,非常简洁。并非所有Windows上的设备驱动程序都需要内核模式才能运行。视频驱动程序,我相信音频驱动程序,现在在WindowsVista和Windows7中都以用户模式运行。另外,微软现在提供了一个用户模式驱动程序框架。请注意,如果它与.NET一起使用,可能仍然是基于C/C++的。这是一个用C语言编写的Wi-Fi适配器驱动程序,该链接不再直接指向UMDF,我的Google fu今天没有显示任何可以用C语言编写用户模式驱动程序的内容。@Oran:谢谢,我已经更新了链接。我认为C#不用于UMDF,因为Microsoft不提供开箱即用的支持,您需要自己做很多事情(声明函数、常量、结构等)。2019年更新:。“基于UDDF的客户端驱动程序是一个进程内的COM服务器(DLL),C++是编写USB设备的客户端驱动程序的首选语言。”我听说现在编写JavaScript的最好的语言是JavaScript(反语)。驱动程序开发的本质需要C++技巧,所有涉及的代码都是C相关的,可能与汇编相关(指针、段、分页等),C是太高的级别。