从C#通过PInvoke调用_msize()

时间:2012-06-05 22:02:48

标签: c# pinvoke

我正在编写一个C#库,其中调用应用程序将传递大量连续的非托管内存。这个调用应用程序可以来自.Net或Visual C ++(如果是从C ++调用我的库,它将通过中间C ++ / CLI库)。验证有足够的内存是有用的,所以我决定调用_msize()函数。不幸的是,_msize似乎总是给我错误的尺寸。 我回去并在我的示例应用程序中修改了我的分配例程,然后立即调用_msize。这是我的代码snipet:

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认为分配的内存少于所要求的内存。任何人都有任何线索,为什么这是?关于我应该做什么的任何建议都会受到赞赏。

1 个答案:

答案 0 :(得分:2)

P /调用LocalSize函数。

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

所以看起来只有纯粹的好运才能_msize返回任何对你有用的东西。也许malloc使用GlobalAlloc(或LocalAlloc),或者只是在被要求使用大块时使用_msize,并请求一些额外的空间用于簿记;在这种情况下{{1}}会试图弥补这一点。