调用非托管Dll

一、平台调用详解(基本原理)
ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_fxinterop/html/ba9dd55b-2eaa-45cd-8afd-75cb8d64d243.htm
平台调用依赖于元数据在运行时查找导出的函数并封送其参数。下图显示了这一过程。
对非托管 DLL 函数的“平台调用”调用

调用非托管Dll - picacure - picacure的博客
当“平台调用”调用非托管函数时,它将依次执行以下操作: 
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]。
像处理其他任何托管方法一样调用托管类上的方法。 
posted @ 2010-10-08 20:49  jiangC  阅读(239)  评论(0编辑  收藏  举报