プラットフォーム呼び出しを使用する場合、引数を 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]
デフォルトで考慮されますか?