如何:使用 PInvoke 從 Managed 程式碼呼叫原生 DLL

在 Unmanaged DLL 中實作的函式可以使用平台叫用 (P/Invoke) 功能,從 Managed 程式碼呼叫。 如果 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 屬性)