2011-04-05 5 views
6

मैं एरे के बारे में एक जवाब ढूंढ रहा हूं। क्लेयर (...) विधि सी # में कवर के तहत होती है।ऐरे क्या है। क्लेयर वास्तव में कवर के तहत क्या करता है?

मैंने आईएल को देखा है, लेकिन यह वास्तव में कोई संकेत नहीं दे रहा है, क्योंकि यह बस सिस्टम को कॉल करता है। एर्रे :: साफ़ (...) विधि mscorlib में, जो तब एक अप्रबंधित हिस्से को कॉल करता है सीएलआर जो मैं देख नहीं सकता।

कारण मैं यह क्यों पूछ रहा हूं, यह है कि मुझे कभी-कभी मेरी कॉल द्वारा एरे द्वारा फेंक दिया गया एसईएचएक्सप्शन मिल रहा है। क्लीयर, और मुझे यह पता लगाना प्रतीत नहीं होता कि यह क्यों हो रहा है। http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.sehexception(v=VS.100).aspx

"कोई भी SEH अपवाद है कि स्वचालित रूप से करने के लिए मैप नहीं है:

दुर्भाग्य से, माइक्रोसॉफ्ट यह क्या मतलब हो सकता है जब अपवाद फेंक दिया जाता है के बारे में थोड़ा चुप्पी साधे होने के लिए ...

से

लगता है डिफ़ॉल्ट रूप से SEHException क्लास में एक विशिष्ट अपवाद मैप किया जाता है। अधिक जानकारी के लिए, एमएसडीएन लाइब्रेरी में "अप्रबंधित अपवाद" और "संरचित अपवाद हैंडलिंग" पर खोजें। "

इस पर कोई मदद की सराहना की जाएगी ... बस मुझे सही दिशा में इंगित करें!

धन्यवाद!

+0

आपके पास उस ऐरे का क्या है जिसे आप साफ़ करने का प्रयास कर रहे हैं? वस्तुओं का प्रकार क्यों? – rsbarro

+0

त्रुटि को पुन: उत्पन्न करने वाले कोड की सबसे छोटी राशि पोस्ट करें। – jason

+0

आप हमेशा (पूर्व में मुफ्त) .NET परावर्तक के साथ विधि को विघटित कर सकते हैं। यह आपको बताएगा कि क्या हो रहा है। –

उत्तर

5

आप एसएससीएलआई 20 स्रोत कोड में उस तरह का कोड देख सकते हैं। जो सभी शोर निकाले जाने के साथ इस तरह दिखता है:

FCIMPL3(void, SystemNative::ArrayClear, ArrayBase* pArrayUNSAFE, INT32 iIndex, INT32 iLength) 
{ 
    BASEARRAYREF pArray = (BASEARRAYREF)pArrayUNSAFE; 
    // error checks 
    //.. 
    char* array = (char*)pArray->GetDataPtr(); 
    int size = pArray->GetMethodTable()->GetComponentSize(); 
    ZeroMemory(array + (iIndex - lb) * size, iLength * size); 
} 

दूसरे शब्दों में, यह बस तत्वों में 0 बाइट्स विस्फोटों। एक एसईएचएक्सप्शन प्राप्त करने का एकमात्र तरीका प्रोसेसर गलती के माध्यम से होता है। जीसी ढेर भ्रष्टाचार। किसी भी पिनवोक या COM इंटरऑप कोड की समीक्षा करें।

+0

यह वही है जो मैं ढूंढ रहा था ... मैं इसे वास्तव में कोड को पोस्ट करने के लिए पोस्ट नहीं कर सकता, क्योंकि कोड काफी बड़े एप्लिकेशन में एम्बेड किया गया है। लेकिन वास्तव में यह सब कुछ हो रहा है कि मैं 4096 बाइट्स के बाइट सरणी को साफ़ करने की कोशिश कर रहा हूं। समस्या यह है कि त्रुटि असंगत रूप से फसल हो रही है, इसलिए इसके लिए टेस्ट-एप लिखने का कोई तरीका नहीं है। –

+0

इसके अलावा, मेरे पास मेरे प्रोजेक्ट में कोई पिनवोक या COM इंटरऑप कोड नहीं है, इसलिए यह कम स्तर पर किसी प्रकार के भ्रष्टाचार की तरह दिख रहा है, जिस पर मेरा नियंत्रण है। –

+0

दर्दनाक। सीएलआर पर विचार न करें जब तक कि आपके पास पुराना अप्रचलित संस्करण न हो। कुछ पर्यावरण, बकवास जो किसी भी प्रक्रिया में खुद को इंजेक्ट करता है। अपवाद का त्रुटि कोड मूल्य क्या है? –

6

यह मैं क्या हुड के नीचे हो रहा है के एक करीबी मानचित्रण का प्रदर्शन करने की कोशिश कर रहा हूँ कल्पनाArray.Clear के लिए सबसे आसान तो

public static void Array.Clear<T>(T[] array) { 
    for (int i = 0; i < array.Length; i++) { 
    array[i] = default(T); 
    } 
} 

की तरह लिखा जा रहा मुझे पता Array.Clear वास्तव में एक सामान्य विधि नहीं है । वास्तव में, हालांकि यह

memcopy(&array, 0, array.Length * sizeof(T)); 

के करीब है इस कोड को एक SEHException फेंक रहा है तो सबसे संभावित कारण स्रोत सरणी के आसपास स्मृति दूषित है है। सबसे संभावित स्रोत गलत PInvoke या COM इंटरऑप कॉल है।

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