C#中如何调用自己写的驱动程序

popdrummer 2011-11-17 11:19:03
前段时间写了个GPIO驱动程序,生成了一个dll文件,想用C#开发的应用程序调用这个驱动。查了一些资料,给的方法有用[DLLImport]来调用dll文件,然后声明调用函数;还有说用windows API函数CreateFile,DeviceIOControl,CloseHandle,来对设备进行操作,可是C#中有这些函数么,现在有点迷糊了,烦请高手给一个清晰的思路。
...全文
988 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
popdrummer 2011-11-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 northcan 的回复:]
CreateFile,DeviceIOControl,CloseHandle这些都是WinCE系统的API函数。
应用程序可以通过这几个API与流驱动进行交互。

应用层调用CreateFile,会间接调用流驱动的XXX_Open,打开流驱动
应用层调用DeviceIOControl,会调用流驱动的XXX_IOControl,针对不同的Ioctls,做相应的工作。
应用层调用CloseH……
[/Quote]
这些我已经搞清楚了,我迷糊就在于我自己写了一个驱动,驱动生成了一个GPIODrv.dll文件,那我在C#中编写应用程序时,需不需要将这个文件用DllImport引用进来,如果需要,如何使用?
popdrummer 2011-11-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 northcan 的回复:]
回完了帖子才发现楼主的结贴率:0.00%
[/Quote]
呵呵,这是我发的第二个帖子,第一个帖子还没有解答完,谢谢你的回答,我试一下
northcan 2011-11-17
  • 打赏
  • 举报
回复
回完了帖子才发现楼主的结贴率:0.00%
northcan 2011-11-17
  • 打赏
  • 举报
回复
CreateFile,DeviceIOControl,CloseHandle这些都是WinCE系统的API函数。
应用程序可以通过这几个API与流驱动进行交互。

应用层调用CreateFile,会间接调用流驱动的XXX_Open,打开流驱动
应用层调用DeviceIOControl,会调用流驱动的XXX_IOControl,针对不同的Ioctls,做相应的工作。
应用层调用CloseHandle,会调用流驱动的XXX_Close,关闭驱动

c#是托管代码,不像native c++,c++可以直接调用这几个Windows CE的API函数。
c#需要先调用DllImport,引入这些函数的声明,之后就可以像c++一样使用它们了。
具体这几个函数的用法,参考MSDN。
91program 2011-11-17
  • 打赏
  • 举报
回复
CreateFile,DeviceIOControl,CloseHandle 这些函数是 CE 系统的,搞清楚调用方法都可以有。
popdrummer 2011-11-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 northcan 的回复:]
呵呵,看来你没看懂我的回复。
GPIODrv.dll是驱动

------------
应用
------------
系统
------------
驱动
------------

应用层 需要通过 系统 才能够让驱动完成某种工作。驱动是由系统来管理的。
所以你写应用的时候,不用也不能够去管GPIODrv.dll。

我上面已经说了,你调用的是系统的API,比如Cr……
[/Quote]
已经成功了,谢谢你的帮助,加分结贴!
northcan 2011-11-17
  • 打赏
  • 举报
回复
呵呵,看来你没看懂我的回复。
GPIODrv.dll是驱动

------------
应用
------------
系统
------------
驱动
------------


应用层 需要通过 系统 才能够让驱动完成某种工作。驱动是由系统来管理的。
所以你写应用的时候,不用也不能够去管GPIODrv.dll。

我上面已经说了,你调用的是系统的API,比如CreateFile,系统会去调用你GPIODrv.dll导出的XXX_Open函数。而不是你应用层直接调用GPIODrv.dll的导出函数。

楼主应该补一补操作系统的知识吧。
具体点,在wince下驱动是有驱动管理器device.dll来加载并管理的。你在写应用的时候不会直接调用它。
当初的实现是这样的,通过编一个 DLL 来调用服务控制台 API 从而完成驱动程序的安装, 然后再在 C# (应用程序是使用的 C# WinForm ,驱动程序必须和这个应用程序通信)通过平台调用, 访问这个 DLL ,这样就可以实现驱动程序的动态加载以及动态启动服务和停止服务等等操作了。 而在下面呢,我也算是对以前的那个 DLL 做一个总结,将其总结为一个 C# 类,这样以后用起来会更加方便。 整个的类,我按分层的思想将其分为三块(其实这里将其这样划分不是非常合适) DriverEntity.cs 这里即是所谓的实体层,在该类下面呢,主要包括的是将要在 DriverBLL 使用到的一些常量数据, 这些数据呢包括服务的类型,服务启动类型,当然也包括了将会使用到的一些结构类型等等信息。 DriverDAL.cs 这个类即是所谓的数据访问层, 一般来说,数据访问层用在使用数据库的情况下比较合适, 但是在这里我将其抽象为只要是提供最基本的数据服务的 API ,我都将其放在数据访问层, 所以这里主要是 C# 平台调用时,对于将要调用的 Win32 API 的一个声明, 其包括了 CreateFile ,OpenService 等等 API 的声明。 DriverBLL.cs 这里就是所谓的业务逻辑层了,其实呢,说白了,其包括几个重要的方法的实现, 比如启动驱动程序服务,停止驱动程序服务,安装启动程序,卸载驱动程序等方法的实现。 该类是为应用程序提供驱动程序安装功能的直接类。

19,523

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧