मैं निम्नलिखित सी ++ समारोह परिभाषा है, जो मैं प्रबंधित कोड से PInvoke के माध्यम से कॉल करने के लिए कोशिश कर रहा हूँ है:मार्शल SIZE_T * के लिए सही तरीका?
bool FooBar(SIZE_T* arg1);
मेरे कामयाब घोषणा के रूप में देखा इस प्रकार है:
[DllImport("mydll", SetLastError=true, CharSet=CharSet.Unicode)]
private static extern bool FooBar(ref uint arg1);
आप में से कुछ एक ही देख सकते हैं अंततः मैंने किया बग। यह 64 बिट पोर्टेबल नहीं है। SIZE_T परिवर्तनीय आकार (32-64 बिट) का है क्योंकि यह सूचक है। प्रबंधित आकार पर पॉइंटर सही ढंग से 64 बिट तक अनुवाद करता है, लेकिन यूंट नहीं करता है, और आप arg1 के ऊपरी बिट्स में ट्रैश के साथ समाप्त हो सकते हैं। यह एक विशेष रूप से लगातार त्रुटि के बाद से कचरा अक्सर था सिर्फ शून्य :(
एकमात्र समाधान मैं काम करने के लिए मिल गया है निम्नलिखित कामयाब घोषणा है:
[DllImport("mydll", SetLastError=true, CharSet=CharSet.Unicode)]
private static extern bool FooBar(ref IntPtr arg1);
बेशक यह काम करता है क्योंकि IntPtr इसके आकार भिन्न हो सकते हैं सही ढंग से। मेरे कोड में मैं केवल इंटीपीआरटी को एक पूर्णांक के रूप में मानता हूं, और यह काम करता है, हालांकि यह बदसूरत हैक की तरह दिखता है। ऐसा लगता है कि यह ठीक से निर्दिष्ट करने का कोई तरीका होना चाहिए, शायद UnmanagedType.SysUInt का उपयोग करके, लेकिन मैं रहा हूं किसी भी अन्य कामकाजी समाधान के साथ आने में असमर्थ।
मैं इसे एक बदसूरत हैक के रूप में देखता हूं क्योंकि IntPtr को किसी चीज़ के लिए सूचक का प्रतिनिधित्व करना चाहिए। हालांकि मैं इसे सीधे एक पूर्णांक के रूप में सीधे इलाज कर रहा हूं। SysUInt विशेष रूप से बताता है कि यह एक यूंट की एक चर आकार का प्रतिनिधित्व है। वास्तव में जो मैं चाहता हूं, सिवाय इसके कि मैं यह समझ नहीं पा रहा हूं कि इसे SysUInt के बजाय एक SysUInt सूचक के रूप में मूल रूप से मार्शल कैसे करें। – sooniln
आप SIZE_T को एक तर्क के रूप में एक संकेतक का उपयोग कर रहे हैं, Soonil। IntPtr बहुत उपयुक्त दिखता है –
आपको पता चलेगा कि मैं इंटप्राट का उपयोग नहीं कर रहा हूं, हालांकि, मैं रेफ इंटिप्ट का उपयोग कर रहा हूं। – sooniln