通过 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认为分配的内存小于要求的内存。 有人知道这是为什么吗?关于我应该做什么的任何建议也将不胜感激。

通过 C# 中的 PInvoke 调用 _msize()

P/Invoke the LocalSize 函数。

_msize用于确定分配malloc(及其友元)的块的大小。 AllocHGlobal是围绕GlobalAllocLocalAlloc的包装器(取决于您相信的引用;但我认为两者是等效的),并且您希望LocalSize函数确定实际返回的块的大小。据我所知,Marshal不包含LocalSize的包装器,但您可以使用 P/Invoke 调用它。

因此,似乎只有运气好,_msize才能返回任何对您有用的东西。也许malloc使用GlobalAlloc(或LocalAlloc),无论是总是还是只是在被要求大块时,并要求一点额外的簿记空间;在这种情况下,_msize将试图弥补这一点。