调用非托管Dll
平台调用依赖于元数据在运行时查找导出的函数并封送其参数。下图显示了这一过程。
对非托管 DLL 函数的“平台调用”调用
当“平台调用”调用非托管函数时,它将依次执行以下操作:
1. 查找包含该函数的 DLL。
2. 将该 DLL 加载到内存中。
3. 查找函数在内存中的地址并将其参数推到堆栈上,以封送所需的数据。
只在第一次调用函数时,才会查找和加载 DLL 并查找函数在内存中的地址。
4. 将控制权转移给非托管函数。
平台调用会向托管调用方引发由非托管函数生成的异常。
1、[url=ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_fxinterop/html/3e3f6780-6d90-4413-bad7-ba641220364d.htm]标识 DLL 中的函数[/url]。
最低限度上,必须指定函数的名称和包含该函数的 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.[url=ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_fxinterop/html/e08e4c34-0223-45f7-aa55-a3d8dd979b0f.htm]创建用于容纳 DLL 函数的类[/url]。
在C#内声明的Dll函数,必须包含在一个具体类中,可以使用现有类,或为每一非托管函数创建单独的类,或者创建包含一组相关的非托管函数的一个类。
注意:在一个类中,每个要调用的 DLL 函数定义为静态方法。
3. [url=ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_fxinterop/html/ecdcf25d-cae3-4f07-a2b6-8397ac6dc42d.htm]在托管代码中创建原型[/url]。
[C#] 使用 DllImportAttribute 标识 DLL 和函数。
用 static 和 extern 修饰符标记方法。
有关DllImportAttribute具体属性,请参看CSDN帮助
4. [url=ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_fxinterop/html/113646de-7ea0-4f0e-8df0-c46dab3e8733.htm]调用 DLL 函数[/url]。
像处理其他任何托管方法一样调用托管类上的方法。