2009-04-03 7 views
7

पर कैसे डाला जाए, मैं इंटरऑप के माध्यम से एक विधि को कॉल कर रहा हूं जो out IntPtr पैरामीटर देता है। मैं इस IntPtr के लिए byte* कैसे प्राप्त कर सकता हूं ताकि मैं इसे संचालित कर सकूं? मैंने निम्नलिखित कोशिश की:इंटप्राट को बाइट *

fixed(byte* ptr = (byte)myIntPtr) 

लेकिन यह काम नहीं किया। किसी भी सहायता की सराहना की जाएगी!

+1

हाय दिमित्री, क्या आप या तो अधिक जानकारी का अनुरोध कर सकते हैं, या उत्तर स्वीकार कर सकते हैं? –

उत्तर

13

आप बस लिख सकते हैं:

byte* ptr = (byte*)int_ptr; 

आप तय कीवर्ड का उपयोग करने की जरूरत नहीं है। आप IntPtr को पिन नहीं करना चाहते हैं, है ना?

+0

यह भी ठीक काम करता है, हालांकि व्यक्तिगत रूप से मुझे ToPointer विधि पसंद है, विशेष रूप से यदि आपको इसे किसी विशिष्ट प्रकार सूचक (जैसे शून्य * से बाइट *) में परिवर्तित करने के लिए तत्काल आवश्यकता नहीं है। – Noldorin

5

myIntPtr.ToPointer()

+0

ध्यान दें कि निश्चित कीवर्ड वास्तव में इस मामले में अपरिवर्तनीय नहीं है क्योंकि इसका उपयोग चर के स्थानांतरण को रोकने के लिए किया जाता है। चूंकि IntPtr पहले से ही एक (प्रबंधित) सूचक है, इसलिए आप अनिवार्य रूप से केवल दो प्रकार के बीच प्रत्यक्ष रूपांतरण चाहते हैं। यह भी देखें http://msdn.microsoft.com/en-us/library/f58wzh21(VS.71).aspx – Noldorin

+2

इस मामले में IntPtr * एक प्रबंधित पॉइंटर नहीं बल्कि एक अप्रबंधित सूचक है! –

+1

हाँ, मेरा वास्तव में क्या मतलब है कि IntPtr इस अर्थ में एक प्रबंधित सूचक है कि यह प्रबंधित पुस्तकालयों का हिस्सा है, जबकि बाइट * एक असुरक्षित सी-शैली सूचक है। शायद "सुरक्षित" एक बेहतर शब्द होगा, हालांकि IntPtr और SafeHandle के बीच अंतर को ध्यान में रखना महत्वपूर्ण है। – Noldorin

1

यदि आप अपने आवेदन में असुरक्षित कोड नहीं चाहते हैं, तो आपको System.Runtime.InteropServices.Marshal में विधियों का उपयोग करना होगा, या (यहां तक ​​कि बेहतर) अपने इंटरऑप फ़ंक्शंस पैरामीटर प्रकारों को घोषित करना होगा ताकि मार्शलिंग स्वचालित रूप से हो।

1

मुझे अपने आवेदन में "असुरक्षित कोड" नहीं चाहिए था, इसलिए मैंने एक इंटिप्टर को बाइट [] में परिवर्तित करने के लिए निम्नलिखित किया। एक IntPtr "unsafeDataBlock" कहा जाता है को देखते हुए:

var byteArray = new byte[dataBlockSize]; 
System.Runtime.InteropServices.Marshal.Copy(unsafeDataBlock, byteArray, 0, dataBlockSize); 
1

यह मेरे लिए काम करने के लिए लग रहा था, मैं Interop का उपयोग नहीं किया गया था, लेकिन अभी भी सी तीव्र से एक प्रबंधित सी ++ फ़ंक्शन को कॉल किया गया था। प्रबंधित सी ++ फ़ंक्शन को हालांकि अप्रबंधित कोड कहा जाता है, इसलिए यह इंटरऑप जैसी ही चीज़ को पूरा करता है।

वैसे भी, सी ++ समारोह है कि सी तेज से बुलाया गया था में, मैं इस कोड का इस्तेमाल किया:

(anyPointerType *) सूचक = (anyPointertype *) myIntPtr.ToPointer();

+1

बस यह स्पष्ट करने के लिए कि मेरा क्या मतलब है: " मैं इंटरऑप का उपयोग नहीं कर रहा था लेकिन अभी भी सी शार्प से प्रबंधित सी ++ फ़ंक्शन को कॉल कर रहा था। प्रबंधित सी ++ फ़ंक्शन को अप्रबंधित कोड कहा जाता था, इसलिए यह इंटरऑप जैसा ही काम करता था। " Interop के माध्यम से unmanged कोड बुला: सी तीव्र - (का उपयोग इंटरॉप कॉल)> अप्रबंधित कोड कि अप्रबंधित कोड कॉल सी तेज एक प्रबंधित C++ समारोह से फोन कर एक ही के रूप में परिणाम है: सी तीव्र - (कॉल)> प्रबंधित सी ++ फ़ंक्शन - (कॉल)> अप्रबंधित कोड और बाद की प्रक्रिया आमतौर पर बहुत आसान होती है –