本周因为工作需要,针对“东进电话语音模拟卡”提供的API接口,写个测试程序,需要用C#调用VC封装的DLL动态库,上网查找,查来查去始终都是一个人的大作,不是很满意,自己查看MSDN帮助,动手总结一下,这是MSDN帮助的URL
ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_fxinterop/html/eca7606e-ebfb
看完这个帮助后,可以在再查看一下DllImportAttribute的相关属性,就差不多了。
MSDN 的帮助太详细了,而且链接跳了跳去,看的头大,自己就想暂时能调用DLL就可以了,所以下边是自己简要提取的帮助:
一、平台调用详解(基本原理)
ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_fxinterop/html/ba9dd55b-2eaa-45cd-8afd-75cb8d64d243.htm
平台调用依赖于元数据在运行时查找导出的函数并封送其参数。下图显示了这一过程。
对非托管 DLL 函数的“平台调用”调用
当“平台调用”调用非托管函数时,它将依次执行以下操作:
1. 查找包含该函数的 DLL。
2. 将该 DLL 加载到内存中。
3. 查找函数在内存中的地址并将其参数推到堆栈上,以封送所需的数据。
|
只在第一次调用函数时,才会查找和加载 DLL 并查找函数在内存中的地址。
|
4. 将控制权转移给非托管函数。
平台调用会向托管调用方引发由非托管函数生成的异常。
二、调用方法(实际操作)
1、标识 DLL 中的函数。
最低限度上,必须指定函数的名称和包含该函数的 DLL 的名称
例:
using System.Runtime.InteropServices;
[DllImport("user32.dll") EntryPoint=" MessageBox ")]
public static extern int MessageBox(int hWnd, String text,
String caption, uint type);
注意:1、必须引用 System.Runtime.InteropServices 命名空间
2、如果函数不需要重新命名,入口属性 EntryPoint 可以不写,
但动态库引用必须设定。
在C#内声明的Dll函数,必须包含在一个具体类中,可以使用现有类,或为每一非托管函数创建单独的类,或者创建包含一组相关的非托管函数的一个类。
注意:在一个类中,每个要调用的 DLL 函数定义为静态方法。
3. 在托管代码中创建原型。
[C#] 使用 DllImportAttribute 标识 DLL 和函数。
用 static 和 extern 修饰符标记方法。
有关DllImportAttribute具体属性,请参看CSDN帮助
4. 调用 DLL 函数。