如何:使用 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);
}