调用非托管Dll

 

    本周因为工作需要,针对“东进电话语音模拟卡”提供的API接口,写个测试程序,需要用C#调用VC封装的DLL动态库,上网查找,查来查去始终都是一个人的大作,不是很满意,自己查看MSDN帮助,动手总结一下,这是MSDN帮助的URL

ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_fxinterop/html/eca7606e-ebfb -4f 47-b8d9-289903fdc045.htm

看完这个帮助后,可以在再查看一下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 函数的“平台调用”调用

调用非托管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 可以不写,

但动态库引用必须设定。

 

2创建用于容纳 DLL 函数的类

C#内声明的Dll函数,必须包含在一个具体类中,可以使用现有类,或为每一非托管函数创建单独的类,或者创建包含一组相关的非托管函数的一个类。

注意:在一个类中,每个要调用的 DLL 函数定义为静态方法。

 

3. 在托管代码中创建原型

[C#] 使用 DllImportAttribute 标识 DLL 和函数。

static extern 修饰符标记方法。

  有关DllImportAttribute具体属性,请参看CSDN帮助

 

4. 调用 DLL 函数

像处理其他任何托管方法一样调用托管类上的方法。

你可能感兴趣的:(dll)