मैं एक प्रबंधित वस्तु है कि एक COM सर्वर कॉल कुछ स्मृति को आबंटित करने की है। प्रबंधित ऑब्जेक्ट को मेमोरी लीक से बचने के लिए प्रबंधित ऑब्जेक्ट से पहले उस स्मृति को मुक्त करने के लिए COM ऑब्जेक्ट को फिर से कॉल करना होगा। यह ऑब्जेक्ट IDisposable
लागू करता है ताकि यह सुनिश्चित करने में सहायता मिल सके कि सही मेमोरी-रिलीज़िंग COM कॉल किया गया है।क्या अंतिम बार से आरसीडब्ल्यू कॉल करना सुरक्षित है?
यदि Dispose
विधि नहीं है, तो मैं ऑब्जेक्ट के फ़ाइनलज़र को स्मृति मुक्त करने के लिए चाहता हूं। मुसीबत को अंतिम रूप देने के नियमों है कि आप क्योंकि आप नहीं जानते कि क्या अन्य वस्तुओं पहले से ही GC'd गया और/या आप से पहले अंतिम रूप दे दिया किसी भी संदर्भ का उपयोग नहीं करना चाहिए, है। यह फ़ील्ड होने के लिए एकमात्र स्पर्श करने योग्य वस्तु स्थिति छोड़ देता है (हैंडल सबसे आम है)।
लेकिन एक COM सर्वर बुला स्मृति है कि मैं एक क्षेत्र में संग्रहीत करने के लिए एक कुकी है, मुक्त करने के लिए एक क्रम प्रतिदेय आवरण (RCW) के माध्यम से जा शामिल है। कि RCW सुरक्षित एक finalizer (यह GC'd को नहीं की गई या अंतिम रूप दे दिया इस बिंदु पर गारंटी है) से कॉल करने के लिए है?
अंतिम रूप दिए जाने के साथ नहीं परिचित आप में से उन लोगों के लिए है, हालांकि finalizer धागा एक प्रबंधित appdomain की पृष्ठभूमि में चलता है अपनी चल रहा है, पर उन मामलों के संदर्भ को छू के लिए सैद्धांतिक रूप से ठीक हो सकता है, अंतिम रूप देने के भी appdomain बंद में होता है, और जबकि किसी भी क्रम में - न केवल संदर्भ संबंध आदेश में। यह आपके सीमा को सीमित करने के लिए सुरक्षित है जो आप मान सकते हैं। किसी प्रबंधित ऑब्जेक्ट का कोई भी संदर्भ "खराब" (संग्रहित स्मृति) हो सकता है भले ही संदर्भ गैर-शून्य हो।
अद्यतन: मैं बस यह कोशिश की और यह मिल गया:
प्रकार 'System.Runtime.InteropServices.InvalidComObjectException' की एक बिना क्रिया का अपवाद myassembly.dll
अतिरिक्त जानकारी में हुई: COM वस्तु जिसे इसके अंतर्निहित आरसीडब्ल्यू से अलग किया गया है, का उपयोग नहीं किया जा सकता है।
COM सर्वर पर एक विधि (क्यों कोई भी आरसीडब्ल्यू पर निपटान क्यों करेगा? अगर यह भी संभव है तो मुझे आश्चर्य होगा)। –