Trong tôi C# dll Tôi có một số mã như thế này để tương tác với một số dlls không được quản lý:IntPtr.ToInt32() và x64 hệ thống
IntPtr buffer = ...;
TTPOLYGONHEADER header = (TTPOLYGONHEADER)Marshal.PtrToStructure(
new IntPtr(buffer.ToInt32() + index), typeof(TTPOLYGONHEADER));
này đã luôn luôn làm việc tốt khi sử dụng dll của tôi biên soạn trong AnyCPU với .Net2 và .Net4 trên các hệ thống x64, trước khi cài đặt Windows 8.
Với Windows 8 khi sử dụng .Net4 dll Tôi nhận được một hành vi OverFlowException ("Thao tác số học dẫn đến tràn.") tại cuộc gọi buffer.ToInt32().
Các tài liệu MSDN cho IntPtr.ToInt32() nói điều này:
"OverflowException: Trên một nền tảng 64-bit, giá trị của trường hợp này là quá lớn hay quá nhỏ để biểu diễn như một số nguyên ký 32-bit . "
Tôi tự hỏi tại sao vấn đề này chỉ xuất hiện với Windows 8 và cách sửa lỗi chính xác là gì.
Tôi có nên sử dụng một phương pháp như thế này, thay vì gọi IntPtr.ToInt32() không?
internal static long GetPtr(IntPtr ptr)
{
if (IntPtr.Size == 4) // x86
return ptr.ToInt32();
return ptr.ToInt64(); // x64
}
* Luôn * Sử dụng ToInt64(). Hoặc truyền tới (dài). –
Cảm ơn bạn rất nhiều – devdept2
Hans Passant, xin vui lòng gửi nó như là câu trả lời. – Idan