方法: PInvoke を使用してマネージド コードからネイティブ DLL を呼び出す
アンマネージド DLL に実装された関数は、Platform Invoke (P/Invoke) 機能を使ってマネージド コードから呼び出すことができます。 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);
}