System.OverflowException при приведении System.IntPtr к uint - PullRequest
0 голосов
/ 28 декабря 2018

Я пытался сохранить 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();
}

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

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

Screenshot

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

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

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

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

0 голосов
/ 28 декабря 2018

Компилятор сообщает, что размер MaximumApplicationAddress больше uint.

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

private long _maxAddress;

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

    _maxAddress = info.MaximumApplicationAddress.ToInt64();
    resetFields();
}
...