我试图找出一种方法让我的 VirtualAlloc 的 pinvoke 签名返回一个 PageAlignedBuffer。我遇到的问题是我不能有默认构造函数,因为 VirtualFree 方法需要知道缓冲区大小,所以我必须在构造函数中提供它。出于这个原因,我采用了下面的方法,只需从构造函数中调用 VirtualAlloc。
有没有人看到解决这个问题的方法,所以我可以从 pinvoke 调用中返回一个 PageAlignedBuffer ?如果不是,这是否是一个好的解决方案,您是否认为它在安全性或内存泄漏方面存在任何问题?谢谢。
[SecurityCritical]
public sealed class PageAlignedBuffer : SafeBuffer
{
private readonly UIntPtr _bufferSize = UIntPtr.Zero;
public PageAlignedBuffer(long bufferSize) : base(true)
{
_bufferSize = checked ((UIntPtr) bufferSize);
this.handle = WinAPI.VirtualAlloc(IntPtr.Zero, _bufferSize, AllocationType.RESERVE | AllocationType.COMMIT, MemoryProtection.READWRITE);
}
[SecurityCritical]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
protected override bool ReleaseHandle()
{
return WinAPI.VirtualFree(this.handle, _bufferSize, FreeType.Release);
}
}