平台调用是一项服务,它使托管代码能够调用动态链接库(DLL)中实现的非托管函数,例如 Windows API 中的函数。 它查找并调用导出的函数,并根据需要跨互作边界封送其参数(整数、字符串、数组、结构等)。
本部分介绍与使用非托管 DLL 函数相关的任务,并提供有关平台调用的详细信息。 除了以下任务外,还有一般注意事项和一个提供其他信息和示例的链接。
若要使用导出的 DLL 函数
-
必须至少指定包含函数的函数的名称和 DLL 的名称。
-
可以使用现有类,为每个非托管函数创建单个类,或者创建一个包含一组相关非托管函数的类。
-
[Visual Basic]将 Declare 语句与 Function 和 Lib 关键字一起使用。 在某些情况下,可以将 DllImportAttribute 与 共享函数 关键字一起使用。 本部分稍后将介绍这些情况。
[C#]使用 DllImportAttribute 标识 DLL 和函数。 为此方法标记 static 和 extern 修饰符。
[C++]使用 DllImportAttribute 标识 DLL 和函数。 使用 外部“C”标记包装方法或函数。
有关演示如何构造要用于平台调用的基于 .NET 的声明的示例,请参阅用平台调用封送数据。
平台调用详解
平台调用依赖于元数据来查找导出的函数并在运行时封送其参数。 下图显示了此过程。
当平台调用非托管函数时,它将执行以下操作序列:
找到包含函数的 DLL。
将 DLL 加载到内存中。
在内存中找到函数的地址,并将其参数推送到堆栈上,并根据需要对数据进行封送。
注释
查找和加载 DLL,并在内存中查找函数的地址仅在对函数的第一次调用时发生。
将控制转移到非托管函数。
平台调用将非托管函数生成的异常抛给托管调用方。