P/Invokeとデリゲート
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/09/07 20:52 UTC 版)
「デリゲート (プログラミング)」の記事における「P/Invokeとデリゲート」の解説
プラットフォーム呼び出し(P/Invoke)の際は、デリゲートは既定でアンマネージ(ネイティブ)の関数ポインタにマーシャリングされる。 例えば下記のようなC言語関数がMyLibrary.DLLに実装されているとする。 typedef BOOL (__stdcall*TMyCallbackFuncPtr)(LPCWSTR fileName);/* カレントディレクトリのファイルを列挙する関数。ファイルが見つかるごとにコールバック関数が呼ばれる。 */extern __declspec(dllexport) BOOL EnumFiles(TMyCallbackFuncPtr callback); 対応するP/Invokeラッパーインターフェイスおよび呼び出しの一例は下記のようになる。 using System;using System.Runtime.InteropServices;static class MyPInvoker{ public delegate bool MyCallbackDelegate([In, MarshalAs(UnmanagedType.LPWStr)]string fileName); [DllImport("MyLibrary.dll")] public extern static bool EnumFiles(MyCallbackDelegate callback); private static bool MyCallbackMethod(string fileName) { Console.WriteLine(fileName); return true; // 列挙を続行。 } private static void Test() { EnumFiles(MyCallbackMethod); }} P/Invokeでデリゲートを渡す場合は、デリゲート型のインスタンスがガベージコレクションにより回収されてしまわないように注意する必要がある。また、コールバック関数の呼び出し規約が一致するようにしなければならない(.NET 1.1まではstdcall呼び出し規約のみが使用可能だったが、.NET 2.0以降ではUnmanagedFunctionPointerAttribute属性を明示的に指定することでcdecl呼び出し規約を使用することも可能である)。
※この「P/Invokeとデリゲート」の解説は、「デリゲート (プログラミング)」の解説の一部です。
「P/Invokeとデリゲート」を含む「デリゲート (プログラミング)」の記事については、「デリゲート (プログラミング)」の概要を参照ください。
- P/Invokeとデリゲートのページへのリンク