2011-03-14 8 views
5

मैंने इस विशिष्ट अपवाद का उल्लेख करने वाले विभिन्न प्रश्नों को देखा है (this question lists many of them, जिसे मैंने देखा है)। इसके अलावा, मेरे पास general question as this post है, लेकिन एक अलग संदर्भ में, इसलिए the answer मेरे लिए सहायक नहीं है।अमान्य कॉमऑब्जेक्ट एक्सेप्शन का क्या कारण बनता है: "COM ऑब्जेक्ट जिसे इसके अंतर्निहित आरसीडब्ल्यू से अलग किया गया है, का उपयोग नहीं किया जा सकता है।"

संदर्भ

मैं एक वर्ग AxWindowsMediaPlayer कि एक वर्ग, View कहा जाता है जो एक Panel के भीतर है के स्वामित्व में है से ली गई है, एक Workspace भीतर है। मैंने हाल ही में इस स्थिति के आसपास a question से पूछा, लेकिन उस प्रश्न को निर्देश दिया गया था कि के लिए मेरा कामकाज यह समस्या ठीक है। उस सवाल से पृष्ठभूमि यहाँ प्रासंगिक है:

 
    .-----------------------. 
    |Workspace    | 
    |.--------. .--------. | 
    ||Panel1 | |Panel2 | | 
    ||.-----. | |.-----. | | 
    |||View1| | ||View2| | | 
    ||'-----' | |'-----' | | 
    |'--------' '--------' | 
    '-----------------------' 

जब एक View निपटारा हो जाता है, एक विधि कहा जाता Synchronize() शेष View वस्तुओं के सभी पर बुलाया जाएगा। View के लिए जिसमें AxWindowsMediaPlayer है, यह videoPlayer.Error.clearErrorQueue() पर कॉल करता है।

समस्या

जब मैं शीर्ष स्तर (Workspace.Dispose()) पर Dispose() कहते हैं, अगर एक और View निपटारा हो जाता है और उसके बाद का कारण बनता है Synchronize() शेष View वस्तुओं पर कहा जाता था, ViewAxWindowsMediaPlayer क्लास वाली एक फेंकता videoPlayer.Error.clearErrorQueue() लाइन पर अपवाद करते हुए कहा:

InvalidComObjectException: COM उद्देश्य यह है कि उसके अंतर्निहित RCW से अलग किया गया ख नहीं कर सकते ई इस्तेमाल किया।

मैं कैसे AxWindowsMediaPlayer उसके अंतर्निहित RCW (Runtime Callable Wrapper) से अलग हो रही है द्वारा हैरान हूँ। मैंने this article that talks about this exception पढ़ा है और Marshal.ReleaseComObject() पर कॉल करने के खतरे हैं। मैं इस विधि को स्पष्ट रूप से नहीं बुला रहा हूं। मैं Panel और View और VideoPlayerControl वर्गों (AxWindowsMediaPlayer से निकला है), लेकिन उन में से कोई भी हिट हो इससे पहले कि अपवाद होता है की Dispose तरीकों पर breakpoints डाल दिया है।

मेरा कामकाज यह सुनिश्चित करना है कि मीडिया प्लेयर के साथ View हमेशा पहले निपटान हो जाए। यह मेरे पिछले प्रश्न के पीछे प्रेरणा थी। लेकिन मैं यह समझना चाहता हूं कि यह कैसे हो रहा है, इसलिए मैं देख सकता हूं कि यह कुछ ऐसा है जिसे मुझे ठीक करने की ज़रूरत है। से पहले अपने आरसीडब्ल्यू से अलग होने के लिए AxWindowsMediaPlayer को कौन से कारण से वंचित किया जा रहा है?

मेरा अनुमान है कि AxWindowsMediaPlayer अंतिमकर्ता जीसी द्वारा बुलाया जा रहा है, लेकिन मुझे समझ में नहीं आता कि यह क्या चल रहा है। किसी कारण से, उच्च स्तर पर Dispose पर कॉल करने से फर्श के नीचे कॉल करने के लिए Marshal.ReleaseComObject हो रहा है। क्या कोई मुझे प्रबुद्ध कर सकता है?

उत्तर

3

आपका वैकल्पिक हल दुर्भाग्य से, समाधान, है।

Control.Dispose पहले सभी ActiveX नियंत्रणों को दोबारा डिस्पोजेक्ट करता है, और फिर यह बाल नियंत्रण पर Dispose को दोबारा कॉल करता है।आपके उदाहरण में, यदि आप Workspace.Dispose पर कॉल करते हैं, तो आपके AxWindowsMediaPlayer को पहले डिस्पोजेक्ट किया जाएगा, फिर Panel1, Panel2, View1, View2 (आपके नियंत्रण पेड़ को बनाए गए ऑर्डर के आधार पर)।

हम Reflector का उपयोग कर कारण खोज सकते हैं।

internal virtual void DisposeAxControls() 
{ 
    foreach (Control control in Controls) 
    { 
     control.DisposeAxControls(); 
    } 
} 

AxHost वर्ग DisposeAxControls ओवरराइड करता है: के रूप में

protected override void Dispose(bool disposing) 
{ 
    if (disposing) 
    { 
     DisposeAxControls(); 

     foreach (Control control in Controls) 
     { 
      control.Parent = null; 
      control.Dispose(); 
     } 

     base.Dispose(disposing); 
    } 
} 

और DisposeAxControls कार्यान्वित किया जाता है: यदि हम Control.Dispose की जांच, यह अनिवार्य रूप से के रूप में (ध्यान दें, अप्रासंगिक कोड छोड़े गए और थोड़ा पठनीयता में सुधार करने के लिए बदल) इस प्रकार लागू किया गया है होस्टेड ActiveX नियंत्रण को नष्ट करने के लिए।

मुझे सच में यकीन नहीं है कि DisposeAxControls फ़ंक्शन क्यों मौजूद है। ऐसा लगता है कि AxHost एक्टिवएक्स नियंत्रण को नष्ट करने के लिए हर किसी की तरह Dispose को आसानी से ओवरराइड कर दिया होगा, लेकिन ऐसा नहीं है कि चीजें कैसे लागू की जाती हैं।

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

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