System.OverflowException при приведении System.IntPtr к uint

Я пытался спасти MaximumApplicationAddress от SystemInfo в uint, но я получаю System Overflow Exception:

System.OverflowException: арифметическая операция вызвала переполнение

Я много пробовал и тоже много гуглил, но ничего не помогает. Если я конвертирую или использую десятичную дробь, ничего не помогло.

Вот проблемный код:

private uint _maxAddress;

public MemorySearch()
{
    SystemInfo info;
    GetSystemInfo(out info);

    // This line throws a System.OverflowException:
    _maxAddress = (uint)info.MaximumApplicationAddress;
    resetFields();
}

Полный исходный код здесь

Вот скриншот ошибки:

Есть идеи?

2 ответа

Там нет явного или неявного преобразования из IntPtr в uint (UInt32). Существует явное преобразование в Int32, См. https://docs.microsoft.com/en-us/dotnet/api/system.intptr.op_explicit?view=netframework-4.7.2.

Эта функция бросает OverflowException если вы называете это в 64-битной системе.

Если вы действительно хотите превратить ваш 64-битный указатель в 32-битное значение, то вам придется привести к ulong, а затем к uint,

Компилятор говорит вам, что размер MaximumApplicationAddress больше чем uint,

Попробуйте использовать long (64-разрядное целое) вместо:

private long _maxAddress;

public MemorySearch()
{
    SystemInfo info;
    GetSystemInfo(out info);

    _maxAddress = info.MaximumApplicationAddress.ToInt64();
    resetFields();
}
Другие вопросы по тегам