一个关于.net下面的底层设备调用问题

来源:互联网 发布:民族艺术研究 知乎 编辑:程序博客网 时间:2024/04/29 23:56
用.net搭建了一个驱动的类库,然后需要用它调用设备厂商提供的库函数来编写自己的驱动程序,结果遇到了很奇怪的问题。
因为设备厂商提供的是一个.h头文件,是给c++用的,.net无法直接引用。于是按照开发手册,直接找到设备的驱动文件xx.dll,本来以为在.net下面直接用DLLImport就可以了,可结果呢,呵呵……
首先是Import进来了驱动的load方法,经过调试,结果是调用成功。
然后是Import进来了驱动的Open方法,这次有意思了。无论是单步调试还是运行,Open方法都无法成功执行,报告的错误是“程序模块非法”,真晕啊!可是使用VS2003的那个“执行下一步”的按钮,Open方法就能成功执行,真是奇怪死了!
无奈之下,只好反汇编一下看看了,发现在call的地方有一个区别,这个不是代码的区别,而是程序运行的区别。当不使用“执行下一步”的按钮时,call立刻返回,而使用那个按钮,call则会等待函数执行完成之后返回。这个可真是奇怪了啊!!
怎么办呢?我想到用c++调用驱动的库文件,编译成一个dll,然后用.net再调用这个dll。结果还是不行,跟上面直接Import的结果一模一样。
不过最后问题还是解决了,我把load和open两个方法一起封装进了一个方法里面,这次open方法成功执行了。想来想去,感觉是.net的虚拟机对硬件中断的支持有些问题吧,或者是我的使用方法有问题。现在依然不明白为什么把两个方法封装进了一个函数里面之后就ok了……
不过虽然还是不清楚到底是为什么,但是好算也提供了一个解决.net同底层设备访问的问题吧,呵呵。
原创粉丝点击