通过 C# 中的 PInvoke 调用 _msize()
本文关键字:msize 调用 中的 PInvoke 通过 | 更新日期: 2023-09-27 18:36:18
我正在编写一个 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的内存大小。我看到了不同数字的相似结果。它不到 0.01% 的折扣,如果它结束了,我会完全理解,但事实是它低于,这意味着_msize认为分配的内存小于要求的内存。 有人知道这是为什么吗?关于我应该做什么的任何建议也将不胜感激。
P/Invoke the LocalSize
函数。
_msize
用于确定分配malloc
(及其友元)的块的大小。 AllocHGlobal
是围绕GlobalAlloc
或LocalAlloc
的包装器(取决于您相信的引用;但我认为两者是等效的),并且您希望LocalSize
函数确定实际返回的块的大小。据我所知,Marshal
不包含LocalSize
的包装器,但您可以使用 P/Invoke 调用它。
因此,似乎只有运气好,_msize
才能返回任何对您有用的东西。也许malloc
使用GlobalAlloc
(或LocalAlloc
),无论是总是还是只是在被要求大块时,并要求一点额外的簿记空间;在这种情况下,_msize
将试图弥补这一点。