7

SWigで生成されたラッパーを調べていると、PInvokesにはエントリポイントが定義されていないことがわかりましたが、一部の場所にはエントリポイントがあります。では、それらの違いは何ですか?いつEntryPointを定義する必要があり、いつ定義する必要はありませんか?

なしで定義EntryPoint

[DllImport("Kernel32.dll", CharSet = CharSet.Unicode)]
public static extern bool ReadFile(
        HandleRef hndRef,
        StringBuilder buffer,
        int numberOfBytesToRead,
        out int numberOfBytesRead,
        int flag);  

で定義Entrypoint

[DllImport("Kernel32.dll", CharSet = CharSet.Unicode, EntryPoint = "ReadFile")]
public static extern bool ReadFile2(
        HandleRef hndRef,
        StringBuilder buffer,
        int numberOfBytesToRead,
        out int numberOfBytesRead,
        Overlapped2 flag);

また、なぜ関数は次のようにならなければならないのstaticですpublic static externか?externこのメソッドが外部で定義されていることをコンパイラに伝えていると思いますか?

4

1 に答える 1

13

このEntryPointフィールドは、呼び出されているDLLから呼び出す関数を.NETランタイムに通知するのに役立ちます。設定されていない場合、デフォルトは.NETメソッド宣言と同じ名前です。2番目の例では、省略すると、ランタイムが(存在しない)EntryPoint = "ReadFile"という名前の関数を呼び出そうとします。ReadFile2

仕様にそのように記載されているため、プロトタイプにはstaticextern修飾子が必要です。である必要はありません; メソッドの可視性を制御するのは完全にあなた次第です。public

于 2012-06-21T09:52:26.473 に答える