У меня есть несколько проектов (управляемых и неуправляемых), которые работают в 32- и 64-разрядных операционных системах с
.Net 4.0 давно.
Когда мы обновились до .Net 4.6 (4.0 -> 4.6) и запустили этот код:
Marshal.PtrToStructure(DataInfo, info);
DataInfo = (IntPtr)((int)DataInfo + Internal_Const.DataInfoSize);
Мы получили следующую ошибку:
Proj1 терпит неудачу на OverflowException: арифметическая операция привела к
переполнение
мы решили проблему, приведя к длинному, то есть:
Marshal.PtrToStructure(DataInfo, info);
DataInfo = (IntPtr)((long)DataInfo + Internal_Const.DataInfoSize);
Итак, мой вопрос, почему это помогло? и почему рухнул только после перехода на .Net 4.6?
Наша теория состоит в том, что, поскольку это 64-битная система, указатель может указывать на память дальше, чем 32-битная, и при попытке привести ее к int происходит сбой.
Тем не менее, у нас много 64-битных систем, работающих много лет, и это никогда не выходило из строя до перехода на .Net 4.6.
Благодарю.
Задача ещё не решена.
Других решений пока нет …