P/Invoke

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動先: 案内検索

P/Invoke(Platform Invoke、プラットフォーム呼び出し)とは、.NET Frameworkにおける共通言語基盤 (CLI) の機能の一つであり、マネージコードから動的ライブラリ内のネイティブコードを呼び出すことを可能にするものである。受け渡しされるデータ型は、必要であればCLIによって適切に変換されるが、メタデータによってプログラマーが変換方法を指定することもできる。こうしたデータの変換をマーシャリングという。

[編集]

P/Invokeの宣言は、System.Runtime.InteropServices.DllImportAttribute属性をメソッドの宣言につけることで行う。

次のC#コード例では、user32.dll内に定義されているFindWindow関数を呼び出している。

using System.Runtime.InteropServices;

namespace Example
{
    class ExampleClass
    {
        // FindWindowのアンマネージシグネチャは HWND FindWindow(LPCTSTR, LPCTSTR)
        [DllImport("user32.dll")]
        static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
        
        public void Test(string windowName)
        {
            IntPtr hWnd = FindWindow(null, windowName);
            if (hWnd == IntPtr.Zero)
            {
                Console.WriteLine("Window not found.");
            }
            else
            {
                Console.WriteLine("There is a window named " + windowName + ".");
            }
        }
    }
}

このように、P/Invokeで宣言したメソッドは通常のメソッドのように呼び出すことができる。

intdoubleのような型はアンマネージコードが直接解釈することができるため、コピーされずにメモリに固定されたまま直接渡される(blittable型)。一方、stringboolのような型はマネージコードとアンマネージコードとの間で表現方法が異なるため、CLIによって変換処理(マーシャリング)が行われる(非blittable型)[1]

また、DllImportのフィールドを指定することで、文字列のキャラクタセット、呼び出し規約、エラー処理などといった既定の動作を変更することができる。例えば、次の宣言ではメソッド名とは異なる名前の関数を呼び出し対象とするよう指定している。

// ShellExecuteのアンマネージシグネチャは HINSTANCE ShellExecute(HWND, LPCTSTR, LPCTSTR, LPCTSTR, LPCTSTR, INT)
[DllImport("shell32.dll", EntryPoint="ShellExecute")]
static extern IntPtr UnmanagedFunctionWithNewName(
    IntPtr hWnd,
    string lpVerb,
    string lpFile,
    string lpParameters,
    string lpDirectory,
    int nShowCmd
);

Windows APIと.NET Frameworkの対応表[編集]

以下の表はWindows APIでの型名、.NET Framworkでの型名、C#/VBでの型名の対応を示した。

Windows APIでの型名 .NET Frameworkでの型名 C#での型名 Visual Basicでの型名
HANDLEHBITMAPなどハンドルを表す型名 (void*) System.IntPtr System.IntPtr System.IntPtr
BYTE(unsigned char) System.Byte byte Byte
SHORT(short) System.Int16 short Short
WORD(unsigned short) System.UInt16 ushort UShort
INT(int)、LONG(long) System.Int32 int Integer
UINT(unsigned int)
DWORDULONG(unsigned long)
System.UInt32 uint UInteger
BOOL(long) System.Boolean bool Boolean
CHAR(char) System.Char char Char
LPSTR(char*)
LPWSTR (wchar_t*)
System.Text.StringBuilder System.Text.StringBuilder System.Text.StringBuilder
LPCSTR(const char*)
LPCWSTR(const wchar_t*)
System.String string String
FLOAT(float) System.Single float Single
DOUBLE(double) System.Double double Double

外部リンク[編集]

脚注[編集]

  1. ^ Blittable 型と非 Blittable 型