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();
}