2012-09-12 17 views
7

मेरी सी # dll में मैं कुछ अप्रबंधित DLLs के साथ बातचीत करने के लिए इस तरह कुछ कोड है और विंडोज 8 स्थापित करने से पहले x64 सिस्टम पर .Net4।IntPtr.ToInt32() और 64 प्रणालियों

विंडोज 8 के साथ .Net4 dll का उपयोग करते समय मुझे एक ओवरफ्लोएक्सप्शन ("अंकगणितीय ऑपरेशन का परिणाम ओवरफ़्लो" मिलता है) बफर पर। ToInt32() कॉल।

IntPtr.ToInt32() के लिए MSDN प्रलेखीकरण इस कहते हैं:

"OverflowException: 64-बिट मंच पर, इस उदाहरण का मूल्य बहुत बड़ी या बहुत एक 32-बिट पर हस्ताक्षर किए पूर्णांक के रूप में प्रतिनिधित्व करने के लिए छोटा है । "

मुझे आश्चर्य है कि यह समस्या केवल विंडोज 8 के साथ क्यों सामने आई है, और इसे ठीक करने का सही तरीका क्या है।

क्या मुझे IntPtr.ToInt32() कॉल के बजाय इस तरह की विधि का उपयोग करना चाहिए?

internal static long GetPtr(IntPtr ptr) 
    { 
     if (IntPtr.Size == 4) // x86 

      return ptr.ToInt32(); 

     return ptr.ToInt64(); // x64 
    } 
+6

* हमेशा * का उपयोग ToInt64()

IntPtr.Add(buffer, index)

के दोनों या है। या (लंबे) तक कास्ट किया। –

+0

आपको बहुत धन्यवाद – devdept2

+0

हंस पासेंट, कृपया इसे उत्तर के रूप में पोस्ट करें। – Idan

उत्तर

1

आपको किसी भी रूपांतरण फ़ंक्शन को केवल जोड़ने और ऑफसेट करने और तुरंत वापस परिवर्तित करने के लिए कॉल नहीं करना चाहिए। IntPtrदो में निर्मित तरीके सीधे एक ऑफसेट जोड़ने के लिए, बस

(buffer + index)

संबंधित मुद्दे