0

当我想在 C# 中获取内存的总值时,我在 MSDN 中找到了一个 kernel32 函数来调用系统中的数据。MSDN 以这种方式声明函数:

[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern bool GlobalMemoryStatusEx(ref MEMORYSTATUSEX lpBuffer);

但这不能正常工作。我将“ref”更改为“[In, Out]”然后它可以正常工作。如何告诉我 C# 中的 [In, Out] 参数是什么?

4

4 回答 4

6

在:http: //msdn.microsoft.com/de-de/library/system.runtime.interopservices.inattribute.aspx

输出:http: //msdn.microsoft.com/de-de/library/system.runtime.interopservices.outattribute.aspx

简而言之:它们控制数据编组的方式。在这种情况下,您同时指定它们,这意味着数据被编组到双方(调用者和被调用者)。

于 2009-10-12T09:48:19.493 回答
2

outref参数用于返回相同变量中的值,如果您不知道将使用它 in 或 out ,则ref 就足够了

如果您只想使用变量从函数接收数据,则Out ,如果您只想向函数发送数据,则In

ref如果你想从一个函数发送和接收数据,如果你什么都不放,那么默认情况下它将是In

注意:当您的方法需要返回多个值时,refout参数非常有用。

于 2009-10-12T09:52:24.130 回答
0

以下定义有效(将 定义MEMORYSTATUSEX为类):

[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GlobalMemoryStatusEx(MEMORYSTATUSEX lpBuffer);

[StructLayout(LayoutKind.Sequential)]
public sealed class MEMORYSTATUSEX {
  public uint dwLength = (uint)Marshal.SizeOf(typeof(MEMORYSTATUSEX));
  public uint dwMemoryLoad;
  public ulong ullTotalPhys;
  public ulong ullAvailPhys;
  public ulong ullTotalPageFile;
  public ulong ullAvailPageFile;
  public ulong ullTotalVirtual;
  public ulong ullAvailVirtual;
  public ulong ullAvailExtendedVirtual;
}

用法

var status = new MEMORYSTATUSEX();
GlobalMemoryStatusEx(status);
于 2009-10-12T10:16:16.333 回答
0

如果您查看MSDN上的函数定义,它会告诉您参数是否为 In/Out:

BOOL WINAPI GlobalMemoryStatusEx(
  __inout  LPMEMORYSTATUSEX lpBuffer
);

一般来说,如果它说,你应该使用 ref 参数,它使任何未来的开发人员更容易弄清楚代码是如何工作的。查看函数调用时,您知道开发人员的意思是要影响参数。

于 2009-10-12T20:10:14.250 回答