1

使用平台调用时,将参数指定为[In]是否会影响运行时处理这些参数的方式?

例如,当 PInvoking 时CreateRemoteThread,根据 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 回答