我有一个MemRead
读取内存并返回字节数组的方法
[DllImport("kernel32.dll", SetLastError = true)]
internal static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, ref byte lpBuffer, int dwSize, out int lpNumberOfBytesRead);
public static Span<byte> MemRead(this Process process, IntPtr address, int size)
{
if (process == null)
throw new ArgumentException("Process is null");
Span<byte> buffer = new byte[size];
bool success = NativeMethods.ReadProcessMemory(process.Handle, address, ref MemoryMarshal.GetReference(buffer), size, out int lpNumberOfBytesRead);
if (!success)
throw new Exception("ReadProcessMemory failed");
if (lpNumberOfBytesRead < size)
throw new Exception($"ReadProcessMemory failed : {lpNumberOfBytesRead} bytes read out of {size}");
return buffer;
}
而且我有方法MemReadInt32
,,MemReadBool
...调用MemRead
并进行转换
public static int MemReadInt32(this Process process, IntPtr address)
{
return BitConverter.ToInt32(MemRead(process, address, 4));
}
现在我想在堆栈而不是堆上分配缓冲区,所以我更改了这一行
Span<byte> buffer = new byte[size];
至
Span<byte> buffer = stackalloc byte[size];
编译器会抛出错误,因为堆栈分配的数组不能暴露在声明范围之外。这是有道理的,这可以防止潜在的堆提升。
但是后来我不得不将转换代码放在与阅读代码相同的方法中。MemReadInt32
并且每个, MemReadBool
, ...都会重复读取代码
我怎样才能避免重复ReadMem
代码,并且仍然获得堆栈分配?