Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

P/Invokeとは? わかりやすく解説

P/Invoke

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2024/02/16 13:43 UTC 版)

P/InvokePlatform 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][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
);

Windows APIと.NET Frameworkの対応表

以下の表にWindows API (Win32/Win64) での型名[3]、.NET Frameworkでの型名、C#/VBでの型名の対応を示す。

Windows APIでの型名 .NET Frameworkでの型名 C#での型名 Visual Basicでの型名
HANDLE(void*) あるいはHBITMAP[注釈 1]などハンドルを表す型名 System.IntPtr System.IntPtr[注釈 2] System.IntPtr
INT_PTR, LONG_PTRなど(ポインタと同サイズの符号付き整数型) System.IntPtr System.IntPtr[注釈 2] System.IntPtr
UINT_PTR, ULONG_PTRなど(ポインタと同サイズの符号無し整数型) System.UIntPtr System.UIntPtr[注釈 2] System.UIntPtr
INT8/SCHAR(signed char) System.SByte sbyte SByte
UINT8/UCHAR/BYTE/BOOLEAN(unsigned char) System.Byte byte Byte
INT16/SHORT(short) System.Int16 short Short
UINT16/USHORT/WORD(unsigned short) System.UInt16 ushort UShort
INT32/INT(int)
LONG32/LONG(long)
System.Int32 int Integer
UINT32/UINT(unsigned int)
ULONG32/ULONG/DWORD(unsigned long)
System.UInt32 uint UInteger
INT64/LONG64/LONGLONG(long long) System.Int64 long Long
UINT64/ULONG64/ULONGLONG(unsigned long long) System.UInt64 ulong ULong
BOOL(int) System.Boolean bool[注釈 3] Boolean[注釈 4]
CHAR(char) System.Byte/System.SByte byte/sbyte Byte/SByte
WCHAR(wchar_t) 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. ^ STRICTシンボル定義の有無によって変化するが、ポインタ型であることに変わりはない。
  2. ^ a b c C# 9.0以降はnintキーワードおよびnuintキーワードが用意されている[4]
  3. ^ sizeof(bool)の結果は1だが、System.Runtime.InteropServices.Marshal.SizeOf(typeof(bool))の結果は4となる。
  4. ^ Len(New Boolean)の結果は2だが、System.Runtime.InteropServices.Marshal.SizeOf(GetType(Boolean))の結果は4となる。

出典

関連項目

外部リンク


P/Invoke

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/10/02 16:40 UTC 版)

Nemerle」の記事における「P/Invoke」の解説

Nemerleネイティブのプラットフォームライブラリを呼び出すことができる。その構文C#その他の.NET言語に非常に似ているusing System; using System.Runtime.InteropServices; class PlatformInvokeTest { [DllImport("msvcrt.dll")] public extern static puts(c : string) : int; [DllImport("msvcrt.dll")] internal extern static _flushall() : int; public static Main() : void { _ = puts("Test"); _ = _flushall(); } }

※この「P/Invoke」の解説は、「Nemerle」の解説の一部です。
「P/Invoke」を含む「Nemerle」の記事については、「Nemerle」の概要を参照ください。

ウィキペディア小見出し辞書の「P/Invoke」の項目はプログラムで機械的に意味や本文を生成しているため、不適切な項目が含まれていることもあります。ご了承くださいませ。 お問い合わせ


英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「P/Invoke」の関連用語

P/Invokeのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



P/Invokeのページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
All text is available under the terms of the GNU Free Documentation License.
この記事は、ウィキペディアのP/Invoke (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。 Weblio辞書に掲載されているウィキペディアの記事も、全てGNU Free Documentation Licenseの元に提供されております。
ウィキペディアウィキペディア
Text is available under GNU Free Documentation License (GFDL).
Weblio辞書に掲載されている「ウィキペディア小見出し辞書」の記事は、WikipediaのNemerle (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。

©2025 GRAS Group, Inc.RSS