में COM के माध्यम से पूछे गए इंटरफेस पर रिलीज कॉम ऑब्जेक्ट मैं सी # और DirectShow.Net का उपयोग कर डिजिटल टीवी (डीवीबी-टी) खेलने के लिए कुछ डायरेक्टशो इंटरफेस के साथ काम कर रहा हूं।मुझे मार्शल को कॉल करने की आवश्यकता है। सी #
_guideData = _transportInformationFilter as IGuideData;
_transportInformationFilter
प्रकार IBaseFilter, पहले एक DirectShow.Net उपयोगिता समारोह के माध्यम से सौंपा एक COM ऑब्जेक्ट की है: मैं हाल ही में रनटाइम त्रुटि COM object that has been separated from its underlying RCW cannot be used.
निम्न पंक्ति में यह त्रुटि हुई का सामना करना पड़ा।
मैं मान लिया त्रुटि की वजह से किसी भी तरह _transportInformationFilter
समय से पहले ही जारी किया जा रहा था, और मैं इसे निम्न विधि का पता लगाया (त्रुटि हटाया हैंडलिंग):
private void AttachGuideDataEvent()
{
IConnectionPoint connPoint = null;
IConnectionPointContainer connPointContainer = null;
try
{
connPointContainer = _transportInformationFilter as IConnectionPointContainer;
if (connPointContainer == null) /* error */
var guideDataEventGuid = typeof (IGuideDataEvent).GUID;
connPointContainer.FindConnectionPoint(ref guideDataEventGuid, out connPoint);
if (connPoint == null) /* error */
int cookie;
connPoint.Advise(this, out cookie);
if (cookie == 0) /* error */
_persistIGuideDataEventCookie = cookie;
}
finally
{
if (connPointContainer != null)
Marshal.ReleaseComObject(connPointContainer);
if (connPoint != null)
Marshal.ReleaseComObject(connPoint);
}
}
जैसा कि मैंने यह समझा, connPointContainer = _transportInformationFilter as IConnectionPointContainer
कॉल में बदल जाना चाहिए था पर _transportInformationFilter
COM ऑब्जेक्ट पर, और इस प्रकार अलग से रिलीज़ होने की आवश्यकता होगी। हालांकि, Marshal.ReleaseComObject(connPointContainer)
पर कॉल अपराधी था जिसने _transportInformationFilter
को अपने आरसीडब्ल्यू से अलग किया; इस कॉल को हटाने से समस्या ठीक हो गई।
यह देखते हुए, मुझे लीकिंग संसाधनों से बचने के लिए सी # में स्पष्ट रूप से COM ऑब्जेक्ट्स (Marshal.ReleaseComObject
का उपयोग करके) को स्पष्ट रूप से रिलीज़ करने की आवश्यकता है?
जानकारी के लिए धन्यवाद। यदि एमएसडीएन दस्तावेज़ कहते हैं कि कॉलर विशेष रूप से एक लौटा इंटरफ़ेस जारी करने के लिए ज़िम्मेदार है (उदाहरण के लिए http://msdn.microsoft.com/en-us/library/ms692476(VS.85).aspx), रनटाइम कॉल का प्रबंधन करेगा ऑब्जेक्ट दायरे से बाहर होने पर मेरे लिए रिलीज करने के लिए, या यह एक स्थिति है कि मुझे रिलीजकॉम ऑब्जेक्ट का उपयोग करना चाहिए? – jeffora
वैसे यह तब काम नहीं करता जब ऑब्जेक्ट "दायरे से बाहर हो जाता है" लेकिन जब आरसीडब्ल्यू के लिए फाइनलर चलता है, तो कॉनपॉइंट के मामले में, यह चोट नहीं पहुंचाता है। ध्यान में रखना महत्वपूर्ण बात यह है कि 'रिलीजकॉम ऑब्जेक्ट' आरसीडब्लू पर चल रहा है, यह 'निपटान' को कॉल करने जैसा है, और यह इसी कारणों से टूट गया है कि '_ = _member IFoo के रूप में; a.Dispose(); _member.DoSomething() 'तोड़ सकता है। –
प्रतिक्रिया के लिए बहुत बहुत धन्यवाद, समझ में आता है। – jeffora