.Net使用非托管程序
开发过程中我们或多或少都要使用到非托管组件,例如常见的ActiveX(一般是vb写的.ocx组件)或Com组件(一般是c++编写)。我们都知道.Net程序是可以使用托管代码的,常见的方式大概可以分为两种:一使用使用DllImport的方式调用直接调用非托管代码;二使用转化为"Interop"开头后缀为".dll"的包装组件(可以通过vs添加引用[vs会自动生成相应组件放到obj文件夹中]或者使用 Tlbimp.exe工具来实现)。
对于第一种方式主要用于简单的调用并且不想用部署ActivX或Com组件的情况下,难点就是根据非托管类型找到对应的托管类型(但是网上介绍了很多方法,包括一些工具来帮助我们解决这个问题)。而对于第二种方法,通过包装类来解决的优点其实就是使用方便,可是它需要注册Com组件(使用regsvr32工具)。
对于第二种方式一块看一个例子吧(第一种我就不再举例子了,有时间我们再重点看一下):
下面一段代码是检查是否插入Usb Key的,UKey的组件本身是ocx控件,通过添加以用UKEYOTPLib在obj中生成一个Interop.UKEYOTPLib.dll来完成对控件的包装,然后在代码中就像使用一般托管组件一样。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
2 using System.Collections.Generic;
3 using System.Text;
4 using UKEYOTPLib;
5 namespace InvokeUnmanagedCode
6 {
7 class Program
8 {
9 staticvoid Main(string[] args)
10 {
11 OtpUKeyClass ukey =new OtpUKeyClass();
12 string devicePath=ukey.FindPort(0);
13 if (ukey.LastErr !=0)//说明没有找到UKey
14 {
15 Console.WriteLine("暂未插入UKey!");
16 }
17 else
18 {
19 Console.WriteLine("已插入Ukey!");
20 }
21 Console.ReadKey();
22 }
23 }
24 }
25
首先我先不注册组件试试,结果如下图提示未找到组件。
接着我注册组件而不插入UKey。
插入UKey后
注意:注册组件一般使用Regsvr32工具,像Ukey这种一般都有安装程序,安装的过程中会自动注册。
以上是常用的调用非托管程序的方法,那么除了这两种方法是不是还有其他方式呢?那就是通过"加载非托管动态链接库"的方式来实现。这个个人用的不太多所以也就不再赘余了。
补充:有时候我们在注册了组件却不知道,或者有重复注册的现象(注意重复注册的话会有可能因为版本不同给你造成困扰)。既然这样如何知道所注册的组件信息呢?答案就是利用window优化大师。执行:系统清理--ActiveX清理--分析,就可以看到所有已注册的Com或ActiveX组件。例如下图我注册的Usb Key组件信息。
在这里再给大家介绍一个小技巧:如果你看到了已注册的信息想要反注册而又怕使用命令行麻烦的话,可以先按照window优化大师给出的组件位置,将其放到别处,然后用windows优化大师修复(因为这是指定的位置不存在相应组件,优化大师就认为这是垃圾信息)就可以将注册信息删除。
![]() |
本作品采用知识共享署名 2.5 中国大陆许可协议进行许可,欢迎转载,演绎或用于商业目的。但转载请注明来自崔江涛(KenshinCui),并包含相关链接。 |