2012-08-17 10 views
8

मैं इस कोड का टुकड़ा है:.NET 4.0 AccessViolationException और WndProc

internal class MTool : NativeWindow 
{ 
    private const int WM_LBUTTONDOWN = 0x0201; 
    public event TipDeactivateEventHandler Deactivate; 

    protected override void WndProc(ref System.Windows.Forms.Message m) 
    {   
     if(m.Msg == WM_LBUTTONDOWN) 
     { 
      if(this.Deactivate != null) 
      { 
       this.Deactivate(); 
      } 
     } 

     base.WndProc(ref m); 
    } 
} 

जब मैं अपने कार्यक्रम चलाने मैं लाइन base.WndProc(ref m); में एक AccessViolationException त्रुटि मिलती है और मैं पता नहीं क्यों।

स्पष्ट रूप से यह .NET 2.0 से 4.0 तक पोर्ट किया गया था और मेरा सिद्धांत यह है कि WNDProc को ओवरराइड करने के स्थान पर अब एक वैकल्पिक विधि हो सकती है। क्या यह मामला है? यदि नहीं, तो मुझे यह अपवाद क्यों मिल रहा है?

+0

क्या आप नमूना का थोड़ा और पूरा पूरा कर सकते हैं? कम से कम दिखा रहा है कि आप MTool विंडो कैसे बना रहे हैं और इसे प्रदर्शित कर रहे हैं? मैं यह सुनिश्चित करना चाहता हूं कि मेरा रेपो आपके नजदीक है। – Tim

+0

तो क्या आप वास्तव में कोई वस्तु नहीं बना रहे हैं, बस वस्तु बना रहे हैं? क्या आपको CreateHandle को कॉल करने की आवश्यकता नहीं है या नेटिवविंडो के लिए ऐसा कुछ उपयोगी होना चाहिए? – Tim

+0

क्या आपने आधार पर ब्रेकपॉइंट डालने का प्रयास किया है। डंडप्रोक और अपवाद उठाए जाने पर एम का मूल्य क्या है ... यह कभी भी कुछ मीटर के लिए काम करता है या इसे पहली बार अपवाद फेंक देता है .. –

उत्तर

7

मैं विधि के ऊपर इस विशेषता को जोड़कर यह तय:

[System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptions] 

फिर लाइन जहां अपवाद आज़माएं/कैच के साथ होता है आसपास के। मुझे यह जानकारी मिली here

+2

क्या अपवाद पैदा करने और इसे ठीक करने का प्रयास करने के लिए बेहतर नहीं होगा? – MikeKulls

1

WndProc के लिए प्रलेखन पूर्ण-विश्वास की मांग दिखाता है। क्या आपने कोशिश की है? उदाहरण:

[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")] 
internal class MTool : NativeWindow 
{ 
    [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")] 
    protected override void WndProc(ref Message m) 
    { 
//... 
+0

कोशिश की, अभी भी एक ही अपवाद प्राप्त कर रहा है। –

0

मुझे संदेह है कि आपके कोड में कुछ बड़ा हो रहा है। आपके स्निपेट के आधार पर, मैं कोशिश करता हूं:

  1. WndProc ओवरराइड पर टिप्पणी करें, क्या यह अभी भी कहीं और दुर्घटनाग्रस्त हो रहा है?
  2. WndProc केवल "base.WndProc (ref msg)" का आह्वान करें। क्या आपको अभी भी वही त्रुटि मिलती है? कॉलस्टैक क्या है? क्या आपके कोड में से कोई भी ढेर में गहरा है?
  3. स्निपेट के साथ-साथ, क्या यह केवल तब होता है जब WM_LBUTTONDOWN? जब यह उस अपवाद को फेंक देता है जो उस हैंडलर को निष्क्रिय करता है?

यदि ये कोशिश करने के लिए व्यावहारिक नहीं हैं, तो संभवतः आपको स्निपेट को अपडेट करने की आवश्यकता है ताकि आप जो भी करने की कोशिश कर रहे हैं उसे बेहतर तरीके से समझाएं।

+2

मैं इसे हल करने के लिए HPCSEAttribute का उपयोग करने के खिलाफ दृढ़ता से अनुशंसा करता हूं। शायद हो रहा है कि आपका प्रबंधित कोड अपवाद फेंक रहा है, या एक मार्शलिंग अपवाद है (आपने पीआरटीस्ट्रक्चर कैसे बनाया?)। जब आपके पास देशी में और बाहर कोड बुनाई होती है तो यह मूल अपवाद के संदर्भ को खो देता है और अंततः सीएलआर को ऐसा लगता है कि यह कैच नहीं कर सकता है। आपके द्वारा सही उत्तर के रूप में फ़्लैग किए गए विशेषता शायद यह अंतर है कि यह क्यों काम करता था, लेकिन एक गहरी समस्या है जो छुपाया जा रहा है। आपको वास्तव में इसे और डीबग करना चाहिए। –