使用非托管 DLL 函数

平台调用是一项服务,它使托管代码能够调用动态链接库(DLL)中实现的非托管函数,例如 Windows API 中的函数。 它查找并调用导出的函数,并根据需要跨互作边界封送其参数(整数、字符串、数组、结构等)。

本部分介绍与使用非托管 DLL 函数相关的任务,并提供有关平台调用的详细信息。 除了以下任务外,还有一般注意事项和一个提供其他信息和示例的链接。

若要使用导出的 DLL 函数

  1. 标识 DLL 中的函数

    必须至少指定包含函数的函数的名称和 DLL 的名称。

  2. 创建用于保存 DLL 函数的类

    可以使用现有类,为每个非托管函数创建单个类,或者创建一个包含一组相关非托管函数的类。

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

    [Visual Basic]将 Declare 语句与 FunctionLib 关键字一起使用。 在某些情况下,可以将 DllImportAttribute共享函数 关键字一起使用。 本部分稍后将介绍这些情况。

    [C#]使用 DllImportAttribute 标识 DLL 和函数。 为此方法标记 static 和 extern 修饰符

    [C++]使用 DllImportAttribute 标识 DLL 和函数。 使用 外部“C”标记包装方法或函数。

  4. 调用 DLL 函数

    与调用任何其他托管方法一样,在托管类上调用方法。 传递结构和实现回调函数是特殊情况。

有关演示如何构造要用于平台调用的基于 .NET 的声明的示例,请参阅用平台调用封送数据

平台调用详解

平台调用依赖于元数据来查找导出的函数并在运行时封送其参数。 下图显示了此过程。

显示平台调用的图表。

当平台调用非托管函数时,它将执行以下操作序列:

  1. 找到包含函数的 DLL。

  2. 将 DLL 加载到内存中。

  3. 在内存中找到函数的地址,并将其参数推送到堆栈上,并根据需要对数据进行封送。

    注释

    查找和加载 DLL,并在内存中查找函数的地址仅在对函数的第一次调用时发生。

  4. 将控制转移到非托管函数。

平台调用将非托管函数生成的异常抛给托管调用方。

另请参阅