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

可以使用平台调用 (P/Invoke) 功能从托管代码调用非托管 DLL 中实现的函数。 如果 DLL 的源代码不可用,P/Invoke 是互操作的唯一选项。 但是,与其他 .NET 语言不同,Visual C++ 提供了 P/Invoke 的替代方法。 有关详细信息,请参阅使用 C++ 互操作(隐式 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 特性)