MemoryMappedViewStream.PointerOffset 值错误

MemoryMappedViewStream.PointerOffset has wrong value

我在理解 MemoryMappedViewStream.PointerOffset 属性 时遇到了一些问题。在这个简单的单元测试中,我希望流的 PointerOffset 等于 500000,但它是 41248。不过流的长度是 10000,所以至少这是正确的。 _fakeDataPath 是一个 100 万字节的文件。

    [TestMethod]
    public void CheckViewHasCorrectOffset()
    {
        using (var mmf = MemoryMappedFile.CreateFromFile(_fakeDataPath))
        {
            using (var stream = mmf.CreateViewStream(500000, 10000))
            {
                Assert.AreEqual(500000, stream.PointerOffset);
            }
        }
    }

单元测试输出是...

Assert.AreEqual failed. Expected:<500000>. Actual:<41248>

CreateViewStream() 是 MapViewOfFile() winapi function 的 .NET 包装器。这个 api 最相关的细节是:

The combination of the high and low offsets must specify an offset within the file mapping. They must also match the memory allocation granularity of the system. That is, the offset must be a multiple of the allocation granularity.

分配粒度一直是64K。或者换句话说,原生 api 要求您指定的偏移量必须始终是 65536 的倍数。

这非常痛苦,他们决定在 .NET 包装器中隐藏该限制。很容易做到,他们只需要将不同的偏移量传递给本机函数,以便它从小于 500000 的最接近对齐的 65536 倍数开始。并使用不同的内部偏移量,这样你仍然可以有效地得到 500000。所以你需要修复你的代码如下:

  Assert.AreEqual(500000 % 65536, stream.PointerOffset);