- Статус
- Оффлайн
- Регистрация
- 13 Фев 2026
- Сообщения
- 309
- Реакции
- 7
Народ, кто ковыряет C# и P/Invoke, подсобите разобраться. Столкнулся с ошибкой InvalidProgramException: Common Language Runtime detected an invalid program при попытке дернуть ReadProcessMemory из собственного нативного враппера.
Суть задачи — рид памяти модуля в другом процессе, всё стандартно: нахожу модуль, беру base address и size, пытаюсь сдампить в буфер. Проблема в том, что рантайм падает не при выполнении, а прямо в момент вызова функции через делегат. Код обертки максимально простой:
Подозрения падают на некорректную маршализацию аргументов в делегате или несовпадение сигнатур (хотя передаю IntPtr и int вроде как по стандарту). Есть мысль, что CLR триггерится на передачу ref/out параметров в натив, либо что-то не так с конвенцией вызова (хотя по умолчанию должен быть stdcall/winapi).
Кто сталкивался с подобным при работе с памятью через C#? Как правильно оформить делегат, чтобы не ловить InvalidProgramException? Просьба подсказать, куда копать, а то я уже перебрал все варианты с Marshal и структурами, результат тот же.
Кто уже допиливал свои врапперы под RPM, отпишитесь, в чем может быть затык?
Суть задачи — рид памяти модуля в другом процессе, всё стандартно: нахожу модуль, беру base address и size, пытаюсь сдампить в буфер. Проблема в том, что рантайм падает не при выполнении, а прямо в момент вызова функции через делегат. Код обертки максимально простой:
Код:
internal static bool ReadProcessMemory(IntPtr hProcess, IntPtr baseAddress, IntPtr buffer, int size, out IntPtr bytesRead)
{
return _readProcMem(hProcess, baseAddress, buffer, (IntPtr)size, out bytesRead);
}
Base: 0x7FFC8AE40000
MemSize: 401408 (0x62000)
[ERROR] InvalidProgramException: Common Language Runtime detected an invalid program.
[STACK] at ReadProcessMemory(IntPtr hProcess, IntPtr baseAddress, IntPtr buffer, Int32 size, IntPtr& bytesRead)
MemSize: 401408 (0x62000)
[ERROR] InvalidProgramException: Common Language Runtime detected an invalid program.
[STACK] at ReadProcessMemory(IntPtr hProcess, IntPtr baseAddress, IntPtr buffer, Int32 size, IntPtr& bytesRead)
Подозрения падают на некорректную маршализацию аргументов в делегате или несовпадение сигнатур (хотя передаю IntPtr и int вроде как по стандарту). Есть мысль, что CLR триггерится на передачу ref/out параметров в натив, либо что-то не так с конвенцией вызова (хотя по умолчанию должен быть stdcall/winapi).
Кто сталкивался с подобным при работе с памятью через C#? Как правильно оформить делегат, чтобы не ловить InvalidProgramException? Просьба подсказать, куда копать, а то я уже перебрал все варианты с Marshal и структурами, результат тот же.
Кто уже допиливал свои врапперы под RPM, отпишитесь, в чем может быть затык?