Как работать с адресами памяти в C#?

201
11 декабря 2021, 12:50

Есть адрес памяти 0x7C4540, и я хочу записать/получить из него значение. Как мне это сделать в C#?

Answer 1

Это опасно, но решимо.

Во-первых разрешите "Небезопасный код" в настройках проекта.

Затем создайте функцию помеченную unsafe.

Вот пример считывания числа (int32) из памяти:

private static unsafe void Test()
{
    var ptr = (int*) 0x7C4540;
    var value = *ptr;
    Console.WriteLine($"Считали число: {value}");
}
Answer 2

Для кросс-платформенности вам нужен тип IntPtr. А дальше... using System.Runtime.InteropServices

Marshal.ReadByte, Marshal.Readxxx, Marshal.Writexxx, и другие ф-ции из Marshal.

IntPtr p = new IntPtr(0xfedcba1);
byte b = Marshal.ReadByte(p); // Может вызвать сбой
Marshal.WriteByte(p,b);// Может вызвать сбой

Не смотря на то, что данный метод позволяет обойтись без пометки unsafe, при неправильной работе получите Access Violation и другие интересные ошибки, и даже креш VM.

READ ALSO
Как сделать, чтобы пользователь должен был удерживать палец на экране и перемещать вверх, вниз?

Как сделать, чтобы пользователь должен был удерживать палец на экране и перемещать вверх, вниз?

Много где читал, но везде или свайп, или просто нажатие на экранКак сделать, чтобы пользователь должен был удерживать палец на экране и перемещать...

181
Получить только Id пользователя

Получить только Id пользователя

Есть код который достает из бд пользователя по его никнейму:

71
В уголку консольное время

В уголку консольное время

Хочу сделать в уголку экрана время которое постоянно обновляется, но при этом чтобы работала основная программаПрограмма это простая менюшка

93
Запуск bash скрипта .Net Core 2.2 C#

Запуск bash скрипта .Net Core 2.2 C#

Необходимо запустить скрипт написанный на Bash из программы написанной на C#net core 2

179