2010-04-02 6 views
6

अभी हाल तक, मैं मानना ​​था कि .NET रनटाइम केवल 1 से COM ऑब्जेक्ट के संदर्भ गिनती बढ़ जाती है जब एक runtime-callable wrapper बनाने, और कहा कि केवल एक ही तरह के क्रम-प्रतिदेय आवरण किसी भी COM ऑब्जेक्ट के लिए बनाया जाता है।.NET रनटाइम COM COM ऑब्जेक्ट्स के लिए संदर्भ गणना> 1 कब रखता है?

यदि मुझे गलत नहीं है, तो उपर्युक्त का तात्पर्य है कि Marshal.FinalReleaseComObject और Marshal.ReleaseComObject अभ्यास में वही काम करते हैं।

हालांकि, आज मैं यह सत्यापित करने के लिए कुछ परीक्षण लिख रहा था कि COM ऑब्जेक्ट्स को मेरे कोड द्वारा ठीक से जारी किया गया है। मैं अनुमानित रूप से जारी ऑब्जेक्ट का आह्वान करके और अपेक्षित InvalidComObjectException की जांच करके ऐसा करता हूं। यह पता चला है कि ऐसे मामले हैं जहां FinalReleaseComObject के बाद अपवाद फेंक दिया गया है, लेकिन ReleaseComObject के बाद नहीं।

इसका मतलब यह है कि .NET 2.0 क्रम एक COM ऑब्जेक्ट के लिए एक से अधिक संदर्भ पकड़ कर सकते हैं? यदि हां, तो यह कब करता है?

उत्तर

5

यहां एक अतिरिक्त स्तर का संकेत है। हां, आरसीडब्ल्यू मूल COM इंटरफ़ेस पॉइंटर्स पर एक संदर्भ संदर्भ रखता है। लेकिन आरसीडब्ल्यू में एक संदर्भ गिनती भी है, हर बार एक COM इंटरफ़ेस पॉइंटर को आरसीडब्ल्यू में मैप किया जाता है, यह बढ़ता जा रहा है। यदि कोई COM विधि इंटरफ़ेस पॉइंटर लौटाता है तो कौन सा हो सकता है। इसी .NET wrapper वर्ग के अंतिमकर्ता इसे कम करता है।

आप सीधे Marshal.ReleaseComObject() है, जो की तरह finalizer करता है एक एक करके यह decrements, और Marshal.FinalReleaseComObject() के माध्यम से उस संदर्भ गिनती है, जो यह शून्य करने के लिए zaps के साथ टिंकर कर सकते हैं गारंटी है कि IUnknown :: रिलीज () विधि कहा जाता है। वे निश्चित रूप से "बेहतर पता है कि तुम क्या कर रहे हैं" श्रेणी में आते हैं। गलत यह रही बदसूरत और undebuggable "COM वस्तु उसके अंतर्निहित RCW से अलग" अपवाद पैदा करता है।

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