2012-09-12 19 views
7

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 
    } 
+6

* Luôn * Sử dụng ToInt64(). Hoặc truyền tới (dài). –

+0

Cảm ơn bạn rất nhiều – devdept2

+0

Hans Passant, xin vui lòng gửi nó như là câu trả lời. – Idan

Trả lời

1

Bạn không nên gọi bất kỳ chức năng chuyển đổi nào chỉ để thêm và bù đắp và chuyển đổi ngay lập tức trở lại. IntPtrhai cách built-in để trực tiếp thêm một bù đắp, một trong hai

IntPtr.Add(buffer, index)

hoặc đơn giản là

(buffer + index)