Monday 8 January 2018

Gethrforexception - उदाहरण


Marshal. GetHRForException, बस-एचआर-के-अपवाद के लिए Let8217s की तुलना में अधिक पहले एक छोटे से कोड स्निपेट को देखकर शुरू होता है: यह पूरी तरह से ठीक लग रहा है, सही नहीं है वास्तव में। यह पता चला है कि इस एपीआई को वास्तव में खराब नाम दिया गया है, और यह वास्तव में अपवाद वस्तु से एचआर को पुनः प्राप्त करने से ज्यादा कुछ नहीं करता है। इस एपीआई का प्रयोग करना गलत तरीके से आपको कुछ अजीब समस्याएं दे सकता है, जैसे कि एक गलत, पुराने अपवाद फेंकना। तो एपीआई वास्तव में आपको HRESULT लौटने के अलावा क्या करता है, यह फ़ंक्शन वर्तमान धागा IErrorInfo ऑब्जेक्ट को अपवाद ऑब्जेक्ट के रूप में सेट करता है। हर धागा में एक एसोसिएटेड IErrorInfo COM ऑब्जेक्ट है, जो शून्य के लिए डिफ़ॉल्ट है। यह IErrorInfo ऑब्जेक्ट पिछले COM API कॉल से विफलता का प्रतिनिधित्व करता है, जो कि GetLastError () Win32 API, या errno C api की तरह है। IErrorInfo ऑब्जेक्ट से, आप त्रुटि विवरण, सहायता फ़ाइल संदर्भ आदि जैसी अधिक जानकारी प्राप्त कर सकते हैं, जिससे आपको त्रुटि के बारे में अधिक जानकारी मिलती है। IErrorInfo ऑब्जेक्ट अपवाद ऑब्जेक्ट को सेट करके (वास्तव में अपवाद ऑब्जेक्ट के आईईआरआरइन्फो कार्यान्वयन पर सेट है, जिसे सभी प्रबंधित ऑब्जेक्ट्स द्वारा साझा किया जाता है), आप अनिवार्य रूप से आपके कॉम कॉलर्स को बता रहे हैं, एक विफलता है, यह विफलता है, यह अपवाद ऑब्जेक्ट है, और आपको इसके बारे में कुछ करना चाहिए, जो स्पष्ट रूप से एक बुरा विचार है यदि आप केवल मानव संसाधन को पुनः प्राप्त करना चाहते हैं कई मामलों में, यह किसी का ध्यान नहीं जा सकता है, अगर आपके COM कॉलर्रैले IErrorInfo को सही ढंग से संभालता है उद्धरण चिह्नों से, मेरा मतलब है कि वे COM IErrorInfo प्रोटोकॉल का अनुसरण करते हैं, जो मूल रूप से हैं: 1. कॉलर वर्तमान थ्रेड से IErrorInfo का उपयोग करते हुए एक COM इंटरफ़ेस को कॉल करते हैं जो कि स्पष्ट रूप से quotI समर्थन IErrorInfoquot 2. कहते हैं (जो COM इंटरफ़ेस लागू करता है) quotI समर्थन IErrorInfoquot, लौटने से पहले IErrorInfo को साफ करना चाहिए। यह GetLastError () errno के समान है, ठीक है अगर यह मामला है, तो गलत तरीके से सेट IErrorInfo को थ्रेड में, आमतौर पर या तो कुछ इंटरफ़ेस कार्यान्वयन द्वारा ओवरराइट किया गया है जो IErrorInfo का समर्थन करता है, या अनदेखा कर दिया गया है। हालांकि, चूंकि मैं वर्णित प्रोटोकॉल वास्तव में हर COM डेवलपर द्वारा बहुत अच्छी तरह से समझ में नहीं आ रहा है, I8217ve अक्सर उन मामलों को देखा जहां COM घटक सिर्फ quotsure कहता है, मैं हर COM इंटरफ़ेस पर IErrorInfo का समर्थन करता है, और वे don8217t setclear IErrorInfo बिल्कुल भी। और फिर, इस खराब आरोपित कॉम इंटरफ़ेस के कॉल करने वाला, पहले से GetHRForException कॉल द्वारा निर्धारित IErrorInfo का उपयोग करके समाप्त होगा, और विश्वास करने के लिए आगे बढ़ता है कि एक त्रुटि है। उदाहरण के लिए, let8217 में निम्न परिदृश्य पर विचार करें: कुछ COM घटक कोड कोड में कॉल अपवाद फेंक देते हैं, IOException कोड अपवाद फैलता है, और मार्शल को कहता है। GETHRForException, जो इस अपवाद के लिए IErrorInfo सेट करता है IOException कोड को किसी अन्य COM घटक B में कॉल करता है आईबी में। फंक आईबी। फंक विफल हो गया और कुछ मानव संसाधन विफलता कोड वापस लौटा, कहते हैं, ईयूटीएफएमएमआरआई सीएलआर एचआर असफलता कोड को देखता है, और COM घटक बी से पूछता है कि आप IErrorInfoquot का समर्थन करते हैं, और B क्वाट्स का जवाब देते हैं, क्यों नहीं, इसके अलावा, यह doesn8217t वास्तव में इसका समर्थन करता है और यह doesn8217t setclear IErrorInfo CLR को IErrorInfo पुनर्प्राप्त करता है, और देखता है कि यह वास्तव में एक प्रबंधित अपवाद है, और OutOfMemoryException के बजाय IOException अपवाद को बाहर निकालता है। अब, आपको आश्चर्य हो सकता है: यह एपीआई वास्तव में पहली जगह के लिए क्या करना है वास्तव में इसका उपयोग COM इंटरॉप में किया जाता है, जहां आप HRESULT को वापस करना चाहते हैं और अपने द्वारा IErrorInfo सेट करना चाहते हैं। यह बहुत अधिक बार होता है 8211 अधिकांश लोग पर्याप्त रूप से खुश हो सकते हैं कि COM इंटरॉप अपवाद को एचआर और आईईआरआरएन्फ़ोन्फ़ (जो मार्शल को कॉल करने के लिए होता है। GETHRForException) करके उस हिस्से की देखभाल करता है। इसलिए जब तक आप वास्तव में नहीं जानते कि आप क्या कर रहे हैं, मेरी सलाह है कि मार्शल से दूर रहें। GetHRForException क्या होगा यदि आप वाकई वास्तव में एक विशिष्ट अपवाद के लिए HRESULT प्राप्त करना चाहते हैं, तो आपको अपवाद का उपयोग करना चाहिए। HRsult संपत्ति। मेरे पास कुछ आईओ कोड है जो एक कोशिश के भीतर एक स्ट्रीम को पढ़ता है .. पकड़ो। यह IOException पकड़ता है और सिस्टम को कॉल करता है। Runtime. InteropServices. Marshal. GETHRForException () पकड़ में, HResult पर आधारित विभिन्न कार्यों को लेने के प्रयास में। कुछ ऐसा है: लेकिन ट्रस्टेडियम के साथ एएसपी के भीतर इस कोड को चलाने से मुझे यह अपवाद मिलता है: कुछ प्रश्न: मुझे लगता है कि अपवाद उत्पन्न हो रहा है क्योंकि GetHRForException को अप्रबंधित कोड में बुलाता है, जिसे मध्यम विश्वास में अनुमति नहीं है। सही यह अपवाद निकाला जा रहा है, गेटहार्टफ़ोअर एक्सप्शन के निष्पादन के समय नहीं, बल्कि उस समय विधि बनने जा रहा है - सही (स्टैकट्र्रेस मेरी पद्धति से पता चलता है, लेकिन मैं निश्चित तौर पर 99 हूं कि कोई आईओ अपवाद नहीं हुआ है) यदि ऐसा है, क्या मुझे आंशिक विश्वास के वातावरण में व्यवहार भिन्न करने के लिए कोई रास्ता नहीं है, जिससे कि मैं GetHRForException (अप्रबंधित कोड) को कॉल न करूं, जहां इसे अनुमति नहीं है दूसरे शब्दों में, मैं कैसे समय के संकलन में जेआईटी को सफल होने की अनुमति दे सकता हूं रनटाइम पर मूल्यांकन करना चाहिए कि कोड को GetHRForException कॉल करना चाहिए () कुछ ऐसा है: मुझे लगता है कि परीक्षण के लिए एक रनटाइम तंत्र है यदि अनुमतियां उपलब्ध हैं, लेकिन इसे खोजने में सक्षम है। संपादित करें क्या इस ब्लॉग आलेख का जवाब माइक्रोसॉफ्ट के शॉनफा कहते हैं कि आप कोशिश नहीं कर सकते किसी LinkDemand द्वारा संरक्षित विधि के आसपास पकड़ो (सुरक्षाएक्सेप्शन) यदि MethodA () मेथोडब () को कॉल करता है, और मेथोडब () को पूर्ण विश्वास के लिए लिंकडिमांड के साथ चिह्नित किया जाता है, तो LinkDemand की जाँच की जाती है, साथ में MethodA Jited है इसलिए SecurityException से बचने के लिए, मुझे एक अलग विधि में Marshal. GetHRForException निकालने की आवश्यकता है I क्या यह सही मेरे कोड पर लागू हुआ है, MethodA () कोड हो सकता है जो कॉल को पढ़ें, और फिर पकड़ में GetHRForException () कॉल करने का प्रयास करता है। GetHRForException है MethodB ()। LinkDemand का मूल्यांकन किया जाता है जब MethodA () JITd है (यह लिंकडिमांड मेरे मध्यम ट्रस्ट एएसपी परिदृश्य में विफल रहता है) अगर मैं GetHRForException को एक नई विधि, मेथड सी () में स्थानांतरित कर लेता हूं, और एक अनिवार्य अनुमति के बाद ही मेथड सी () को कॉल करता हूं। डेमण्ड () सफलतापूर्वक सफल होता है, सैद्धांतिक रूप से मुझे सुरक्षा के समय से जबाव करने में सक्षम होना चाहिए, क्योंकि मेथड सी () अनुमति के बाद ही जेआईटीडी। डेमैन () सफल हो गया। जुलाई 12 09 को 14:20 पूछा सुरक्षा की आवश्यकता है। यह इंगित करता है कि अनुमति की अनुमति है या नहीं, यह सही या झूठे देता है। यह एक अनुमति की मांग नहीं करता है, जैसा कि SecurityPermission. Demand () है। मैं SecurityPermissionFlag. UnmanagedCode के साथ IsUnresticted का उपयोग करने के लिए यह देखने के लिए उपयोग करता हूं कि क्या असेंबली कोड को कॉल करने की अनुमति दी गई है, और उसके बाद केवल अगर अनुमत कोड को कॉल करें तो अनुमति दें एक अतिरिक्त मोड़ है। JIT कंपाइलर, एक विधि संकलित करते समय, CodeAccessPermission LinkDemands के लिए किसी भी विधि पर जांचता है जिसे मेरी संकलित विधि को संकलित किया जाता है। मार्शल। GETHRForException () एक लिंकडिमांड के साथ चिह्नित है इसलिए, मेरी पद्धति जो मार्शल को कॉल करती है। GETHRForException () JIT संकलन के समय एक अनजाने सुरक्षाएक्साशन फेंकता है, जब एक प्रतिबंधित वातावरण में चलाया जाता है, जैसे कि मध्यम विश्वास के साथ एएसपी। इसलिए, हमें उस विधि में कभी जीआईटी नहीं करना चाहिए जो मार्शल को बुलाती है। GETHRForException () उस मामले में, जिसका मतलब है कि मुझे मार्शल को आउट करना होगा। GETHRForException () को मेरे कोड में एक अलग विधि में कहा जाता है जिसे (और इस तरह सीमित किया जाता है) केवल तब जब UnmanagedCode अप्रतिबंधित। यहाँ कुछ उदाहरण कोड है: उत्तर 20 जुलाई 09:17 पर हाँ उत्तर - मध्यम ट्रस्ट कॉल को अप्रबंधित कोड में अनुमति नहीं देगा। एकमात्र विश्वास के स्तर पर यह पूर्ण विश्वास है। निर्भर करता है। सीएएस की मांग रनटाइम में हो सकती है, लेकिन होस्टिंग पर्यावरण भी एक भटकने पर जा सकते हैं और उन चीज़ों की खोज कर सकते हैं जो यह नहीं कर सकते। आप जांच कर सकते हैं कि क्या आप सुरक्षा प्रत्याशा के एक उदाहरण के साथ सीएएस मांग का उपयोग करके अप्रबंधित कोड को कॉल कर सकते हैं। सीएएस की मांग करने के लिए कोड ऐसा लग रहा है जैसे 12 जुलाई को 14:32 उत्तर दिया गया, ठीक है, यह बहुत अच्छी जानकारी है यह क्यू 3 के भाग बी को शामिल करता है लेकिन क्या एक भाग के बारे में मैं कैसे सफल होने के लिए JIT संकलन प्राप्त कर सकता हूँ क्या मैं एक सुरक्षा विशेषता के साथ मेरी विधि को चिह्नित कर सकता हूं या याद रखें, मेरा सिद्धांत यह है कि रनटाइम पर सुरक्षाप्रदर्शन त्रुटि नहीं हो रही है, यह जेआईटी के दौरान हो रहा है - और मुझे लगता है कि आपने पुष्टि की है कि यह संभव है। तो सवाल यह है कि मैं किस कोड को लिखने के लिए JIT को संकलित करने की अनुमति देता हूं। ndash cheeso 12 जुलाई 09 15:50 यह क्रम समय पर हो रहा है, अन्यथा विधानसभा भी लोड नहीं होगा - और इसके लिए विधानसभा होने की अनुमति की आवश्यकता के रूप में चिह्नित किया जाना चाहिए। फिर भी वह यकीनन एक रनटाइम चेक होता है, क्योंकि यह असेंबल लोड पर होगा, जो रनटाइम पर हो सकता है ndash blowdart Jul 12 09 at 16:24 विभिन्न प्रकार की जांच, लिंक मांग एक विधि पर विशेषता है, और वास्तव में जेआईटी के समय में जाँच की जाती है। यह रूपरेखा के द्वारा बहुत अधिक उपयोग किया गया है और इसे सीएलआर स्रोत के बाहर देखने के लिए दुर्लभ है मैं जो दिखाता हूं एक अनिवार्य मांग है, सुरक्षाप्रमाणन की तरह एक घोषणात्मक नहीं है (सुरक्षाएक्शन. लिंकडैमैंड, अप्रतिबंधित सत्य) ndash blowdart जुलाई 12 09 पर 18:55

No comments:

Post a Comment