呼び出し元のアプリが大量の連続した管理されていないメモリを渡すC#ライブラリを作成しています。この呼び出し元のアプリは、.NetまたはVisual C ++のいずれかから取得できます(C ++からの場合は、ライブラリを呼び出す前に中間のC ++ / CLIライブラリを通過します)。十分なメモリがあることを検証すると便利なので、_msize()関数を呼び出すことにしました。残念ながら、_msizeは常に間違ったサイズを返すようです。サンプルアプリに戻って割り当てルーチンを変更し、すぐに_msizeを呼び出しました。これが私のコードスニペットです:
public unsafe class MyMemory
{
/// <returns></returns>
[DllImport("msvcrt.dll", SetLastError = true)]
public static extern int _msize(IntPtr handle);
public static IntPtr MyAlloc(int size)
{
IntPtr retVal = Marshal.AllocHGlobal(size);
...
int memSize = MyMemory._msize(retVal);
if (memSize < size)
{
...
}
return retVal;
}
サイズ199229440を渡すと、199178885のmemSizeが返されます。さまざまな数値で同様の結果が得られました。0.01%未満のオフであり、それが終わっていれば完全に理解できますが、実際にはそれは下にあります。つまり、_msizeは、割り当てられたメモリが要求されたものよりも少ないと考えています。なぜこれなのか、誰か手がかりがありますか?そして、代わりに私が何をすべきかについてのアドバイスもいただければ幸いです。