P/Invoke

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

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

次のC#コード例では、内に定義されている関数を呼び出している。
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で宣言したメソッドは通常のメソッドのように呼び出すことができる。

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

また、のフィールドを指定することで、文字列のキャラクタセット、呼び出し規約、エラー処理などといった既定の動作を変更することができる。例えば、次の宣言ではメソッド名とは異なる名前の関数を呼び出し対象とするよう指定している。
// 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 (Win32/Win64) での型名、.NET Frameworkでの型名、C#/VBでの型名の対応を示す。

脚注

注釈

出典

関連項目 
 相互運用性

外部リンク 
 PInvoke.net - Win32 APIをはじめとしたアンマネージAPIのP/Invoke宣言を集めたデータベースサイト。主にC#/VB対応。
 アンマネージ コードとの相互運用 - .NET Framework | Microsoft Learn

.NET Framework