在 C++ 中使用显式 PInvoke(DllImport 特性)
.NET Framework 通过 Dllimport 特性提供了显式平台调用(或 PInvoke)功能,允许托管应用程序调用打包在 DLL 中的非托管函数。 在非托管 API 打包为 DLL 并且源代码不可用的情况下,需要使用显式 PInvoke。 例如,调用 Win32 函数就需要 PInvoke。 否则,请使用隐式 P{Invoke;有关更多信息,请参见使用 C++ 互操作(隐式 PInvoke)。
通过使用 DllImportAttribute 可使用 PInvoke。 此特性将 DLL 的名称作为其第一个参数,放置于要使用的每个 DLL 入口点的函数声明之前。 函数的签名必须与 DLL 导出的函数名称相匹配(对于托管类型,可通过定义 DllImport 声明隐式执行某种类型转换)。
得到的结果是每个本机 DLL 函数的托管入口点,其中包含必需的转换代码(或 thunk)和简单数据转换。 然后托管函数可通过这些入口点调入 DLL。 作为 PInvoke 的结果插入到模块中的代码是完全托管的,并且 /clr、/clr:pure 和 /clr:safe 编译也支持显式 PInvoke。 有关更多信息,请参见纯代码和可验证代码 (C++/CLI)。