2009-07-08 11 views
32

क्या कोई भी छोटा नमूना बना सकता है जो टूटता है, जब तक [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] लागू नहीं होता है?एक प्रतिबंधित निष्पादन क्षेत्र के महत्व का प्रदर्शन करने वाला कोड

मैं बस इस sample on MSDN के माध्यम से भाग गया और मैं इसे तोड़ने में असमर्थ हूं, भले ही मैं विश्वसनीयता नियंत्रण विशेषता पर टिप्पणी करता हूं। अंततः हमेशा बुलाया जाता है।

उत्तर

40
using System; 
using System.Runtime.CompilerServices; 
using System.Runtime.ConstrainedExecution; 

class Program { 
    static bool cerWorked; 

    static void Main(string[] args) { 
     try { 
      cerWorked = true; 
      MyFn(); 
     } 
     catch(OutOfMemoryException) { 
      Console.WriteLine(cerWorked); 
     } 
     Console.ReadLine(); 
    } 

    unsafe struct Big { 
     public fixed byte Bytes[int.MaxValue]; 
    } 

    //results depends on the existance of this attribute 
    [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] 
    unsafe static void StackOverflow() { 
     Big big; 
     big.Bytes[ int.MaxValue - 1 ] = 1; 
    } 

    static void MyFn() { 
     RuntimeHelpers.PrepareConstrainedRegions(); 
     try { 
      cerWorked = false; 
     } 
     finally { 
      StackOverflow(); 
     } 
    } 
} 

जब MyFn लगाया जाता है, तो यह अंततः ब्लॉक से एक प्रतिबंधित क्षेत्र बनाने की कोशिश करता है।

  • विश्वसनीयता नियंत्रण के बिना मामले में, कोई उचित प्रतिबंध नहीं बनाया जा सकता है, इसलिए एक नियमित कोड उत्सर्जित किया जाता है। स्टैक ओवरफ्लो अपवाद को स्टैक ओवरफ्लो पर कॉल पर फेंक दिया गया है (कोशिश ब्लॉक को निष्पादित करने के बाद)।

  • विश्वसनीयता नियंत्रण के मामले में, एक प्रतिबंधित क्षेत्र बनाया जा सकता है और अंत में ब्लॉक में विधियों की ढेर आवश्यकताओं को माईएफएन में हटाया जा सकता है। स्टैक ओवरफ़्लो अपवाद अब माईएफएन को कॉल पर फेंक दिया गया है (कोशिश ब्लॉक को कभी भी निष्पादित करने से पहले)।

+1

ध्यान दें कि यह कोड StackOverflow अपवाद पर गहराई से विफल रहता है, लेकिन यह वास्तव में नहीं है। यदि आप बिग-लाइनों को हटाकर स्टैक को दूषित करते हैं, और स्टैक ओवरव्लो को दोबारा कॉल करते हैं, तो ओओएम ट्रिगर नहीं होता है और एसओ अपवाद नहीं पकड़ा जाता है। यह 'PrepareConstrainedRegions' (afaik) की एक सीमा है। यह भी देखें रिक्टर की CLR पुस्तक: http://books.google.nl/books?id=QMdCf_mm55cC&pg=PT1016&lpg=PT1016&dq=ExecuteCodeWithGuaranteedCleanup+stackoverflowexception&source=bl&ots=V942WGDtFy&sig=I8shxrKexuEKnJPvQf7Cqzck6SE&hl=en&sa=X&ei=NYnpUI-BI8-S0QX6q4GgAw&redir_esc=y – Abel

1

जबकि मेरे पास आपके लिए एक ठोस उदाहरण नहीं है, मुझे लगता है कि आप कोशिश करने का मुद्दा खो रहे हैं .. सफलतापूर्वक गारंटी देने वाले तरीकों के अंदर ब्लॉक करें। यह कहने का पूरा बिंदु कि विधि हमेशा सफल रहेगी इसका मतलब यह है कि निष्पादन के दौरान क्या (अपवाद) होता है, यह सुनिश्चित करने के लिए कदम उठाए जाएंगे कि डेटा का उपयोग किया जाने पर डेटा वैध होने पर वैध स्थिति में होगा। कोशिश के बिना .. आखिरकार, आप कुछ भी सुनिश्चित नहीं करेंगे, और इसका मतलब यह हो सकता है कि आप जो ऑपरेशन करना चाहते हैं, उनमें से केवल आधे ही होंगे। इस प्रकार, सीर। असफल वास्तव में सफलता की गारंटी नहीं देता है, यह केवल इतना कहता है कि डेवलपर सफलता की गारंटी दे रहा है।

सफलता और MayFail राज्यों के बीच मतभेद की एक विवरण के लिए इस पेज चेक आउट के रूप में यह एक Array.CopyTo विधि से संबंधित है: http://weblogs.asp.net/justin_rogers/archive/2004/10/05/238275.aspx

+1

सीईआर मुख्य रूप से मेजबान सीएलआर को एपडोमेन टियरडाउन और अन्य असाधारण स्थितियों के दौरान भ्रष्ट राज्य से बचाने के लिए वहां है। SQL सर्वर जैसे होस्ट कठोर aborts के दौरान अशिष्ट aborts ट्रिगर कर सकते हैं अंत में खंडों में बाधा उत्पन्न हो सकती है। –

+3

थोड़ा और स्पष्ट होने के लिए, सीईआर डेवलपर को लेखन कोड की क्षमता को अनुमति देने के लिए हैं जो असाधारण स्थितियों में अपने स्वयं के राज्य को दूषित करने से बचा सकता है। सीईआर की सुरक्षा करने वाले सीईआर के बारे में कुछ भी निहित नहीं है, यह केवल कोड लिखना संभव बनाता है जो स्वयं की रक्षा कर सकता है। गंदे रहस्य सीएलआर 1.0/1.1 में है, यह कोड लिखने के लिए असंभव था जो अपवादों के कुछ वर्गों के साथ सफलतापूर्वक निपट सकता था। –

+0

लिंक टूटा हुआ है। – doug65536

-4

CER विशेषताओं दस्तावेज के साधन हैं। वे प्रभाव डालते हैं कि सीएलआर कुछ परिस्थितियों में कोड कैसे निष्पादित करेगा, लेकिन मेरा मानना ​​है कि वे (या उनमें से कमी) का परिणाम .NET के मौजूदा संस्करणों में कभी भी त्रुटि नहीं होगी।

वे ज्यादातर 'भविष्य के उपयोग के लिए आरक्षित' हैं।

+0

नकारात्मक वोटों के बावजूद, इस प्रश्न के लिए उदाहरणों की कमी मेरे बिंदु को साबित करती है। सीईआर अंततः ब्लॉक सहित कोड प्रवाह को प्रभावित नहीं करता है। वे कोड कोड करते हैं ताकि ढांचा अलग-अलग इसका इलाज कर सके। असल में, यह अनुवाद करता है "मैं एसिंक अपवाद नहीं बढ़ाऊंगा, आप मुझे एसिंक अपवादों में बाधित नहीं करते हैं"। सीईआर को हटाने से कोड कभी नहीं टूट जाएगा, हालांकि यह इसे कम विश्वसनीय, सांख्यिकीय रूप से बना सकता है। यह भी स्पष्ट है कि वर्तमान में रनटाइम द्वारा लागू किए गए सीईआर का उपयोग अधिक से अधिक के लिए किया जा सकता है। – ima

+3

सीईआर विशेषताएँ केवल दस्तावेज़ीकरण के लिए नहीं हैं; जब एक बाधित निष्पादन क्षेत्र के भीतर से उपयोग किया जाता है तो एक विश्वसनीयता नियंत्रण के साथ चिह्नित एक विधि को जेआईटी द्वारा पूर्व-संकलित करने के लिए निष्पादन से पहले तैयार किया जाएगा और विधि के लिए स्मृति को प्रीपेर कॉन्स्ट्रेनेटेड रेगियंस में प्रवेश करते समय प्री-आवंटित किया जाएगा। –

+0

वे दस्तावेज हैं। वह दस्तावेज सीएलआर द्वारा पढ़ा और उपयोग किया जाता है, जैसा कि मैंने यह भी कहा - यहां कोई विरोधाभास नहीं है। मुद्दा यह है कि, "एक संक्षिप्त नमूना जो टूटता है, जब तक [] लागू नहीं होता है" असंभव है, सीईआर विशेषताओं के बिना कुछ भी टूटता नहीं है। कम भरोसेमंद बन जाता है - हाँ, लेकिन कुछ भी नहीं जिसे "कोड ब्रेक" के रूप में वर्णित किया जा सकता है। – ima

2

क्या आप डीबगर के तहत एमएसडीएन नमूना चला रहे हैं? मुझे नहीं लगता कि जब आप डीबगर के भीतर निष्पादित होते हैं तो सीईआर काम करना संभव है, क्योंकि डीबगर स्वयं भी निष्पादन की प्रकृति को बदलता है।

यदि आप अनुकूलित रिलीज मोड में ऐप बनाते हैं और चलाते हैं, तो आप इसे असफल देख पाएंगे।

17

इस कार्यक्षमता के लिए प्राथमिक ड्राइवर SQL सर्वर 2005 में सीएलआर को एकीकृत करने के लिए SQL सर्वर कड़े आवश्यकताओं का समर्थन करना था। शायद अन्य लोग कानूनी कारणों से उपयोग कर सकते हैं और संभवतः कानूनी कारणों से यह गहरा एकीकरण होस्टिंग एपीआई के रूप में प्रकाशित किया गया था लेकिन तकनीकी आवश्यकताओं एसक्यूएल सर्वर थे। याद रखें कि SQL सर्वर में, एमटीबीएफ को महीनों में मापा जाता है और प्रक्रिया पुनरारंभ नहीं होती है क्योंकि एक अनचाहे अपवाद पूरी तरह से अस्वीकार्य है।

यह MSDN Magazine article शायद सबसे अच्छा है जिसे मैंने तकनीकी आवश्यकताओं का वर्णन करने के लिए देखा है, जिसके लिए बाध्य निष्पादन वातावरण बनाया गया था।

विश्वसनीयता नियंत्रण आपके तरीकों को सजाने के लिए उपयोग किया जाता है यह इंगित करने के लिए कि वे संभावित रूप से एसिंक्रोनस अपवाद (थ्रेडएबॉर्ट एक्सेप्शन, आउटऑफमेमरी एक्सेप्शन, स्टैक ओवरव्लो एक्सेप्शन) के मामले में कैसे काम करते हैं। एक बाधित निष्पादन क्षेत्र को एक कोशिश ब्लॉक के कैच या अंत में (या गलती) अनुभाग के रूप में परिभाषित किया जाता है जो तुरंत सिस्टम के कॉल से पहले होता है। रनटाइम। कॉम्पलर सर्विसेज। रनटाइम सर्विसेज। पेपरारे कॉन्स्ट्रेनड रेगियंस()।

System.Runtime.CompilerServices.RuntimeServices.PrepareConstrainedRegions(); 
try 
{ 
    // this is not constrained 
} 
catch (Exception e) 
{ 
    // this IS a CER 
} 
finally 
{ 
    // this IS ALSO a CER 
} 

जब एक सीईआर के भीतर से एक विश्वसनीयता नियंत्रण विधि का उपयोग किया जाता है, तो इसमें 2 चीजें होती हैं। यह विधि जेआईटी द्वारा पूर्व-तैयार की जाएगी ताकि वह पहली बार जेआईटी कंपाइलर को निष्पादित न करे, जो इसे पहली बार मेमोरी का उपयोग करने और अपने स्वयं के अपवादों का कारण बनने का प्रयास कर सकता है। सीईआर के अंदर भी रनटाइम एक थ्रेडएबॉर्ट अपवाद फेंकने का वादा करता है और सीईआर पूरा होने तक अपवाद फेंकने का इंतजार करेगा।

तो अपने प्रश्न पर वापस जाएं; मैं अभी भी एक साधारण कोड नमूना के साथ आने की कोशिश कर रहा हूं जो सीधे आपके प्रश्न का उत्तर देगा। जैसा कि आप पहले ही अनुमान लगा सकते हैं, सबसे सरल नमूना को समस्या की असीमित प्रकृति को देखते हुए बहुत सारे कोड की आवश्यकता होगी और संभवतः एसक्यूएलसीएलआर कोड होगा क्योंकि यह पर्यावरण है जो सबसे अधिक लाभ के लिए सीईआर का उपयोग करेगा।

+1

यह पूरी तरह से सही नहीं है। यह सुनिश्चित करने के लिए सीईआर का उपयोग 'सेफहैंडल्स' के लिए भी किया जाता है ताकि वे बंद हो जाएं। इसमें किसी भी पी/Invoke के परिणामस्वरूप ओएस सेफहैंडल (जीडीआई +, फाइलें, आदि) शामिल हैं। यदि आप विंडोज़ में हैंडल लीक करना शुरू करते हैं तो आप जल्द ही परेशानी में भाग लेंगे। – Jeremy

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