1

プラットフォーム呼び出しを使用する場合、引数を as として指定する[In]と、ランタイムがこれらにアプローチする方法に違いが生じますか?

たとえば、 PInvokingCreateRemoteThreadがMSDN の記事に従ってlpThreadId指定されている場合:out

HANDLE WINAPI CreateRemoteThread(
  _In_   HANDLE hProcess,
  _In_   LPSECURITY_ATTRIBUTES lpThreadAttributes,
  _In_   SIZE_T dwStackSize,
  _In_   LPTHREAD_START_ROUTINE lpStartAddress,
  _In_   LPVOID lpParameter,
  _In_   DWORD dwCreationFlags,
  _Out_  LPDWORD lpThreadId
);

そして、他のすべての引数は_In_. 私の C# コードでは、その特定の関数を次のように処理します。

    [DllImport("kernel32.dll", EntryPoint = "CreateRemoteThread", SetLastError = true)]
    public static extern IntPtr CreateRemoteThread(
        IntPtr hProcess,
        IntPtr lpThreadAttributes,
        uint dwStackSize,
        IntPtr lpStartAddress,
        IntPtr lpParameter,
        uint dwCreationFlags,
        [Out] IntPtr lpThreadId);

[Out]属性を追加しlpThreadIdて、ランタイムがそれを呼び出し元にマーシャリングすることを認識できるようにします。関数シグネチャを次のように変更すると、ランタイムは関数を別の方法で処理しますか?

    [DllImport("kernel32.dll", EntryPoint = "CreateRemoteThread", SetLastError = true)]
    public static extern IntPtr CreateRemoteThread(
        [In] IntPtr hProcess,
        [In] IntPtr lpThreadAttributes,
        [In] uint dwStackSize,
        [In] IntPtr lpStartAddress,
        [In] IntPtr lpParameter,
        [In] uint dwCreationFlags,
        [Out] IntPtr lpThreadId);

それともまったく同じことでしょうか。引数は[In]デフォルトで考慮されますか?

4

1 に答える 1

5

および属性は実際[In][Out]は非常に重要です。特定の方向にパラメーターをマーシャリングする必要があるかどうかをフレームワークに伝えます。structsこれは、マーシャリングに非常にコストがかかるようなものに特に役立ちます。デフォルトでは、フレームワークはマーシャリングが双方向であると想定しているため、パフォーマンスに大きな影響を与える可能性があります。

アップデート:

いくつかのコメントは、プリミティブ型が[In]デフォルトでマーシャリングされているという事実を提起していますが、これは正しいです。ただし、マーシャリングが複雑であるという事実は、PInvoke 宣言で可能な限り明示的であるという責任を与え、フレームワークが決定することをできるだけ少なくします。

于 2013-07-10T21:19:32.690 に答える