因为我在内存读取等方面有点麻烦。我使用1000000个元素创建了byte []数组,这样它们就可以存储1MB的数据。我使用这些1000000元素阵列中的大约750英寸,我在检索数据时逐一添加,例如:获取内存的MB,添加到列表,获得下一个MB。但它只是失败了溢出异常。那么List是否可以包含多少元素的实际限制,或者是否存在"数据"限制到列表?如果我没有超过此限制,可能导致此问题发生?
EDIT2:我从一个c ++ dll调用一个函数来读取下一个1MB并返回一个指向该数组的指针
EDIT3: C#部分
private static void FetchNextBuffer()
{
IntPtr pRaw = Wrapper.GetNextMB();
byte[] buff = new byte[1000000];
Marshal.Copy(buff, 0, pRaw, 1000000);
RawDataFetch.Add(buff);
}
包装
[DllImport("Dumper.dll")]
public static extern IntPtr GetNextMB();
<小时/> c ++部分 .cpp文件
extern byte * __cdecl GetNextMB()
{
if (!VarsSet) SetVars();
byte buffer[1000000];
ReadProcessMemory(pHandle, (void*)Address, &buffer, sizeof(buffer), 0);
Address = Address + sizeof(buffer);
return buffer;
}
.h文件
extern "C"
{
__declspec(dllexport) DWORD __cdecl GetPID();
__declspec(dllexport) byte * __cdecl GetNextMB();
}
EDIT4:感谢您提供所有见解和快速反应的人(如果他们在场外还有女孩:S)
EDIT5:现在全部修复,程序正在滚动 [![在此处输入图像说明] [2]] [2]
答案 0 :(得分:3)
好的,代码很明显。
您在C ++端分配一个本地数组,并返回指向该数组的指针。如果您习惯使用本机代码,那应该已经敲响了警钟 - 您没有返回指向当地人的指针!
然后你不恰当地使用Marshal.Copy
来杀死它 - 而不是从你从C ++代码中获得的数据中复制(这可能是格式错误的,因为你正在返回指向本地的指针......),您将C#字节数组复制到从C ++函数获得的指针 - 覆盖C ++堆栈。吊杆。
但是,我不明白你为什么只使用C ++库来调用ReadProcessMemory
- 为什么不直接调用呢?我正在https://github.com/Luaancz/AutoPoke的小工具中做到这一点。
答案 1 :(得分:1)
是的,但它取决于你有多少记忆。
如果你有足够的内存来添加超过Int32.MaxValue
的值会破坏List<T>
类。
这可能是OverflowException
的原因。
如果您的内存不足我会期待OutOfMemoryException
。
您获得的错误不是C#异常,而是C ++异常,investigated in this question。
您在C ++代码中做错了什么,或者您从C#中错误地调用了它。请注意,这与我认为已经回答的原始问题非常不同。