トップQs
タイムライン
チャット
視点
P/Invoke
ウィキペディアから
Remove ads
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で宣言したメソッドは通常のメソッドのように呼び出すことができる。
int
やdouble
のような型はアンマネージコードが直接解釈することができるため、コピーされずにメモリに固定されたまま直接渡される(blittable型)。一方、string
やbool
のような型はマネージコードとアンマネージコードとの間で表現方法が異なるため、CLIによって変換処理(マーシャリング)が行われる(非blittable型)[1][2]。
また、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
);
Remove ads
Windows APIと.NET Frameworkの対応表
要約
視点
以下の表にWindows API (Win32/Win64) での型名[3]、.NET Frameworkでの型名、C#/VBでの型名の対応を示す。
Remove ads
脚注
関連項目
外部リンク
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads