如何:使用 PInvoke 从托管代码调用本机 DLL

更新:2007 年 11 月

使用平台调用 (P/Invoke) 功能,可以从托管代码调用在非托管 DLL 中实现的函数。如果 DLL 的源代码不可用,P/Invoke 就是进行交互操作的唯一选择。但是,与其他 .NET 语言不同,Visual C++ 提供了一种替代 P/Invoke 的方法。有关更多信息,请参见使用 C++ Interop(隐式 PInvoke)

示例

下面的代码示例使用 Win32 GetSystemMetrics 函数检索屏幕的当前分辨率(以像素为单位)。

对于仅将内部类型用作参数和返回值的函数而言,并不需要其他操作。其他数据类型(如函数指针、数组和结构)需要一些附加属性以确保进行正确的数据封送处理。

对值类的静态成员进行 P/Invoke 声明使其不存在于全局命名空间中是个好做法(尽管并不要求),如此示例所示。

// pinvoke_basic.cpp
// compile with: /clr
using namespace System;
using namespace System::Runtime::InteropServices;

value class Win32 {
public:
   [DllImport("User32.dll")]
   static int GetSystemMetrics(int);

   enum class SystemMetricIndex {
      // Same values as those defined in winuser.h.
      SM_CXSCREEN = 0,
      SM_CYSCREEN = 1
   };
};

int main() {
   int hRes = Win32::GetSystemMetrics( safe_cast<int>(Win32::SystemMetricIndex::SM_CXSCREEN) );
   int vRes = Win32::GetSystemMetrics( safe_cast<int>(Win32::SystemMetricIndex::SM_CYSCREEN) );
   Console::WriteLine("screen resolution: {0},{1}", hRes, vRes);
}

请参见

其他资源

在 C++ 中使用显式 PInvoke(DllImport 属性)