2010-05-10 12 views
7

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

class Program 
{ 
    static void Main(string[] args) 
    { 
     try 
     { 
      Activator.CreateInstance(typeof(Func<int>), new object[] { new object(), IntPtr.Zero }); 
     } 
     catch 
     { 
      Console.WriteLine("This won't print!"); 
     } 

     Console.Write("Actually this will not print either!"); 
     Console.ReadLine(); 
    } 
} 

कोई फर्क नहीं पड़ता अपवाद प्रकार मैं पकड़ने की कोशिश कैच ब्लॉक निष्पादित नहीं होगा अंदर कोड (वास्तविक अपवाद उत्पन्न एक ArgumentException जहाँ तक मैं बता सकता है)। दरअसल निष्पादन केवल एक्टिवेटर पर ही रुक जाएगा। क्रिएट इंस्टेंस-लाइन।

+0

क्या यह केवल प्रतिनिधियों का निर्माण करते समय होता है? इसके लिए आपको 'Delegate.CreateDelegate' का उपयोग करना होगा। –

+0

यह शायद तब होता है जब प्रतिनिधियों का निर्माण होता है लेकिन वास्तविक कोड जहां इसका उपयोग किया जाता है, इस बात से अवगत नहीं है कि यह किस प्रकार का निर्माण करने की कोशिश कर रहा है, अभी ठीक है कि यह तय करने के लिए "वर्जित" है कि यह तरीका Delegate से प्राप्त होता है या नहीं। –

उत्तर

4

आपको लगता है कि कोड के साथ CLR पर बमबारी की है। प्रभावशाली। वास्तविक दुर्घटना कचरा एकत्रित कचरे का भ्रष्टाचार है, इसे निष्पादन एंजिनएक्सप्शन के साथ संकेत दिया जाता है। जाहिर है कि सीएलआर को अपवाद हैंडलर निष्पादित करने से रोकने के लिए क्षति काफी व्यापक है।

आप connect.microsoft.com पर इसकी रिपोर्ट कर सकते हैं। हालांकि, बग .NET 4.0 में तय किया गया है, यह उचित अपवाद उत्पन्न करता है, ArgumentNullException, "मान शून्य नहीं हो सकता है, पैरामीटर नाम: विधि"। कामकाज स्पष्ट है, जब यह गैर-शून्य स्ट्रिंग की अपेक्षा करता है तो IntPtr.Zero को पास न करें।

1

जब मैं .NET 3.5 में यह कोड चलाता हूं तो मुझे ExecutionEngineException मिलता है। जब रनटाइम इस अपवाद को फेंकता है तो यह Environment.FailFast पर कॉल करने जैसा ही है। जाहिर है यह ढेर पर स्मृति भ्रष्टाचार का एक लक्षण है।

जब मैं अपना उदाहरण कोड निम्नलिखित में स्विच करता हूं तो सही व्यवहार प्राप्त होता है।

Activator.CreateInstance(
    typeof(Func<int>), 
    new object[] { IntPtr.Zero, new object() } 
); 

मुझे अच्छी तरह पता है कि इस जवाबों से ज्यादा सवाल को लाता हूँ ... :)

+0

मैं अपवाद को पकड़ने और इसका निरीक्षण करने में सक्षम नहीं हूं, इसे प्राप्त करने के लिए आपकी सेटिंग्स क्या हैं? –

+0

@Patrik - .NET का कौन सा संस्करण आप चल रहे हैं? – ChaosPandion

+0

3.5 वीएस 2008 का उपयोग करते हुए। –