MemoryMappedViewStream.PointerOffset 속성을 이해하는 데 약간의 문제가 있습니다. 이 간단한 단위 테스트에서 스트림의 PointerOffset은 500000이 되겠지만 41248이라고 예상합니다. 스트림의 길이는 10000이지만 적어도 정확합니다. _fakeDataPath는 1 백만 바이트의 파일입니다.MemoryMappedViewStream.PointerOffset의 값이 잘못되었습니다.
[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>
에서 [소스] (https://referencesource.microsoft.com/#System.Core/System/IO/MemoryMappedFiles/MemoryMappedView.cs,91bd2847a1fb80e7) 무슨 일이 일어나고 있는지 알 수'PointerOffset'를 전용'MemoryMappedView' 생성자에 전달 된 것을 반환하고, 메서드의 주석에 "extraMemNeeded"라고 전달합니다. "extraMemNeeded는 요청한 뷰가 시작되기 전에 할당하는 추가 메모리의 양입니다." MemoryMappedFile.GetSystemPageAllocationGranularity();': 64k가 일반적입니다 :'50 (ulong) 0000 % (64 * 1024) = 41248 '이다. 아마도 버그 일 수 있습니다. – Quantic