P/Invoke

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

 例 
P/Invokeの宣言は、属性をメソッドの宣言につけることで行う。
.NET のバージョン7からは属性を宣言につけることで、DllImport属性と同じように行える(ただしソースジェネレーターによって効率のよい生成を行ってくれる)。

次の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型）Blittable 型と非 Blittable 型 | Microsoft LearnBlittable 型と非 Blittable 型 - .NET Framework | Microsoft Learn。

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

また.C++の構造体をC#でマーシャリングを行う場合は、[StructLayout(LayoutKind.Sequential)]を用いる。以下は、Windows APIのPOINT構造体をC#で定義する例である。
[StructLayout(LayoutKind.Sequential)]
struct Point
{
    public int x; // SDKの定義では LONG x; と定義されているが、C#のintに相当する
    public int y; // SDKの定義では LONG y; と定義されているが、C#のintに相当する
};

 Windows APIと.NET Frameworkの対応表 
以下の表にWindows API (Win32/Win64) での型名Windows Data Types - Windows applications | Microsoft Docs、.NET Frameworkでの型名、C#/VBでの型名の対応を示す。
 Windows APIでの型名  .NET Frameworkでの型名  C#での型名  Visual Basicでの型名 () あるいはなどハンドルを表す型名       , など（ポインタと同サイズの符号付き整数型）       , など（ポインタと同サイズの符号無し整数型）       /()       ///()       /()       //()       /()/()       /()//() //()       //()       ()()///() () () ()() () ()

 脚注 
 注釈 

 出典 

 関連項目 
 相互運用性

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

Category:.NET