Так как я немного возился с чтением памяти и т. Д. И т. Д. И я сделал массивы byte [] с 1000000 элементами, чтобы они хранили по 1 МБ данных каждый. Я использовал около 750 элементов из этого массива 1000000 элементов, который добавлял один за другим, когда извлекал данные, например: получить МБ памяти, добавить в список, получить следующий МБ. Но это просто не удалось с исключением переполнения. Итак, существует ли фактическое ограничение на количество элементов, которое может содержать Список, или существует ли ограничение на «данные» для Списка? Если бы я не перешагнул этот предел, что могло вызвать возникновение этой проблемы?
РЕДАКТИРОВАТЬ: Скриншот исключения
EDIT2: я вызываю функцию из dll c ++, которая читает следующие 1 МБ и возвращает указатель на этот массив
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;
}
.ч файл
extern "C"{
__declspec(dllexport) DWORD __cdecl GetPID();
__declspec(dllexport) byte * __cdecl GetNextMB();
}
EDIT4: Спасибо за все идеи и быстрые ответы, ребята (и девушки, если они там: S)
EDIT5: все исправлено и программа запущена
[! [введите описание изображения здесь] [2]] [2]
Хорошо, код делает это очевидным.
Вы размещаете локальный массив на стороне C ++ и возвращаете указатель на это. Это должно уже прозвучать, если вы привыкли работать с собственным кодом — вы не возвращаете указатели местным жителям!
И тогда вы убиваете его с помощью Marshal.Copy
неправильно — вместо копирования из данных, которые вы получаете из кода C ++ (который, возможно, искажен, потому что вы возвращаете указатель на локальный …), вы копируете байтовый массив C # в указатель, полученный из C ++ функция — перезапись стека C ++. Boom.
Тем не менее, я не понимаю, почему вы используете библиотеку C ++ только для вызова ReadProcessMemory
— почему бы просто не ссылаться на это напрямую? Я делаю это в моем маленьком инструменте в https://github.com/Luaancz/AutoPoke.
Да, но это определяется тем, сколько у вас памяти.
Если у вас достаточно памяти, чтобы добавить Int32.MaxValue
значения, которые это сломало бы List<T>
учебный класс.
Это может быть причиной OverflowException
.
Если у вас заканчивается память, я ожидаю OutOfMemoryException
.
Ошибка, которую вы получаете, является не исключением C #, а скорее исключением C ++, исследован в этом вопросе.
Либо вы сделали что-то не так в своем коде C ++, либо неправильно назвали это из C #. Обратите внимание, это очень отличается от первоначального вопроса, на который, я думаю, я ответил.