方法: 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);
}

関連項目

C++ での明示的な PInvoke (DllImport 属性) の使用方法