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

outパラメータとrefパラメータは、同じ変数の値を返すために使用されます。inまたはoutを使用するかどうかわからない場合は、refで十分です

関数からデータを受信するために変数を使用するだけの場合はOut 、関数にデータを送信するだけの場合はIn 。

関数からデータを送受信したい場合はref 、何も入力しない場合はデフォルトでInになります

注:refおよびoutパラメーターは、メソッドが複数の値を返す必要がある場合に非常に役立ちます。

于 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 に答える