MSDN पर मैं दो विशेषताओं के लिए निम्नलिखित विवरण मिल गया है:DllImport - PreserverSig और SetLastError विशेषताओं
PreserveSig सत्य पर PreserveSig क्षेत्र सेट सीधे HRESULT या retval मूल्यों के साथ अप्रबंधित हस्ताक्षर अनुवाद करने के लिए; HRESULT या retval मानों को अपवादों में स्वचालित रूप से परिवर्तित करने के लिए इसे गलत पर सेट करें। डिफ़ॉल्ट रूप से, PreserveSig फ़ील्ड सत्य है।
SetLastError फोन करने वाले Marshal.GetLastWin32Error एपीआई समारोह का उपयोग करने के निर्धारित करने के लिए विधि निष्पादित करते समय एक त्रुटि हो गई सक्षम बनाता है। विजुअल बेसिक में, डिफ़ॉल्ट सत्य है (जो कुछ ओवरहेड जोड़ता है); सी # और सी ++ में, डिफ़ॉल्ट गलत है।
मेरा प्रश्न है: ये दोनों एक दूसरे से कैसे संबंधित हैं? मान लीजिए कि मेरे पास PreserveSig को 'झूठा' पर सेट किया गया है - इसका मतलब है कि मुझे HRESULT को अपवाद में परिवर्तित करना चाहिए - यदि अप्रबंधित फ़ंक्शन पूर्णांक देता है तो यह इंगित करता है कि त्रुटि या कोई त्रुटि नहीं हुई है, तो इसे अपवाद में कैसे अनुवादित किया जा सकता है?
यदि मैं किसी भी तरह PreserveSig का उपयोग करके अपवाद निकालने में कामयाब रहा तो मुझे GetLastWin32Error विधि को कॉल करने की आवश्यकता क्यों है?
तरह पी का संबंध
मुझे COM ऑब्जेक्ट्स के साथ अनुभव नहीं है इसलिए मुझे विधि हस्ताक्षर बनाने के संबंध में एक और प्रश्न पूछने दें। सवाल यह है: जब मैं देखता हूं कि COM फ़ंक्शन HRESULT लौटाता है, तो मैं अपनी विधि को शून्य लौटने के रूप में चिह्नित कर सकता हूं और PreserveSig = false (जैसा कि आपने कहा था) सेट कर सकते हैं, या PreserveSig = true सेट कर सकते हैं और मैन्युअल रूप से लौटाए गए कोड की जांच करने के लिए IntPtr लौटने के रूप में मेरी विधि को चिह्नित कर सकते हैं? – pkolodziej
हां, यह सही है, सिवाय इसके कि HRESULT UIU32 हैं, IntPtrs नहीं। –
धन्यवाद - आप बहुत उपयोगी रहे हैं। – pkolodziej