Итак, из того, что я могу сказать, каждый управляемый пример добавления IntPtr, который я нашел, это НЕПРАВИЛЬНО .
Например:
http://www.atalasoft.com/cs/blogs/stevehawley/archive/2006/10/16/10987.aspx
Я думал, что если IntPtr имеет значение (или близко) к int32.MaxValue в 32-разрядной системе, и вы добавляете смещение, которое переполняет int32, то это не является действительным адресом памяти (как это было бы верно в uint32, и будет представлен отрицательным числом в IntPtr)?!
Я считаю, что код должен выглядеть примерно так:
public static IntPtr Offset(IntPtr src, int offset)
{
switch (IntPtr.Size) {
case 4:
return new IntPtr((int)((uint)src + offset));
case 8:
return new IntPtr((long)((ulong)src + offset));
default:
throw new NotSupportedException("Not supported");
}
}
Я сумасшедший?
Есть ли у кого-нибудь проверенный пример добавления IntPtr?