2011-08-22 15 views
5

मेरा एप्लिकेशन सी # और सी ++ कोड का मिश्रण है। प्रारंभिक चरण सी ++ मॉड्यूल के दौरान COM (घटक ऑब्जेक्ट मॉडल) तंत्र के माध्यम से सी # लोड में लिखे स्टार्टअप मॉड्यूल। जब तक मैंने सी # भाग को एक डब्ल्यूसीएफ सेवा में जोड़ने का फैसला नहीं किया तब तक सभी ठीक से काम कर रहे थे। सभी डब्ल्यूसीएफ सेवा कॉल COM का उपयोग कर सी ++ कोड पर भेजे जाते हैं। कुछ नई विधियों को जोड़ने के बाद मैंने आउटपुट विंडो में मेमोरी लीक देखी। तो मैंने स्क्रीनशॉट से देखा जा सकता है जैसा कि सी ++ वर्ग के desctructor के लिए ब्रेकपॉइंट जोड़ा। इस बिंदु से अजीब चीजें होने लगती हैं। कार्यक्रम टूटने तक पहुंचने के बाद यह अप्रत्याशित रूप से दुर्घटनाग्रस्त हो जाता है। पहली अजीब चीज यह है कि जब मैं ब्रेकपॉइंट सेट किए बिना प्रोग्राम चलाता हूं तो यह कृपापूर्वक समाप्त होता है। दूसरी अजीब चीज यह है कि प्रोग्राम क्रैश होने का तरीका यह है कि यह डीबगर के बिना चल रहा था। "डीबगर में खोलें" बटन पर क्लिक करने के बाद (या ऐसा कुछ) मुझे त्रुटि संदेश मिलता है: "प्रोग्राम पहले ही डीबगर के तहत खोला गया है।" आउटपुट विंडो में कोई भी संदेश जो मुझे त्रुटि के स्रोत पर इंगित नहीं कर सकता, कोई संदिग्ध कोड नहीं। जब विनाशक को संदेश बॉक्स जोड़ना शुरू होता है तो यह दूसरे के अंश के लिए प्रदर्शित होता है और फिर पूरा एप्लिकेशन बंद हो जाता है (संदेश बॉक्स में प्रदर्शित किए गए संदेशों को पढ़ने के लिए उपयोगकर्ता अवसर जोड़ने के बिना)। किसी भी सुराग के लिए सख्त खोज।COM ऑब्जेक्ट विनाशक डीबगिंग करते समय अजीब दुर्घटना

पीएस समस्या तब होती है जब कम से कम एक बार wcf विधि को बुलाया जाता था। इस विशेष कॉल में प्रोग्राम प्रवाह को C++ स्तर पर भेजा गया था या नहीं, इस पर निर्भर नहीं है।

enter image description here

enter image description here

+0

क्रैश – SpaceghostAli

उत्तर

0

निम्नलिखित कोड द्वारा समाधान किया गया:

public void Dispose() 
{ 
    Marshal.Release(internal_interface_ptr); 
    internal_interface_ptr = IntPtr.Zero; 
    Marshal.ReleaseComObject(internal_interface); 
    Marshal.ReleaseComObject(internal_interface); 
    internal_interface = null; 
} 

के अलावा यह एक अन्य संदर्भ सी ++ कोड में लटक रहा था। तो निष्कर्ष निकालने के लिए, मेरे भाग पर मुख्य गलती सी # कोड में COM ऑब्जेक्ट को स्पष्ट रूप से रिलीज़ करना भूल गई थी। यहां तक ​​कि यदि कचरा कलेक्टर स्मृति प्रबंधन का कार्य लेता है, तो यह अन्य प्रोग्रामिंग भाषाओं में लिखे मॉड्यूल के लिए भी सही नहीं है। COM विनाशक को बहुत हाल ही में बुलाया गया था जब विशेष गतिशील लिंक्ड लाइब्रेरी को स्मृति से उतारना था और इससे समस्याएं उत्पन्न हुईं। आशा है कि मैंने इसे स्पष्ट रूप से समझाया है।

1

जब सी से सी # बुला ++ कभी कभी कचरा कलेक्टर ठीक से कार्यक्रम समाप्त होने से पहले कहा जाता है प्राप्त करता है। अपने सी # कोड के अंत में कचरा संग्रह को मजबूर करने का प्रयास करें।

+0

पर अधिक जानकारी प्राप्त करने के लिए वीएस डीबगर के बजाय WinDbg का उपयोग करने का प्रयास करें जैसे कि चमत्कार गायब हो गया है, फिर भी सभी COM विनाशकों ने अपना काम पूरा करने से पहले कार्यक्रम समाप्त हो गया है। मेरा दूसरा स्क्रीनशॉट देखें। इस सटीक पल कार्यक्रम में इसके खत्म होने से ठीक पहले है, लेकिन कुछ COM विनाशकों ने अभी तक बुलाया है। उनके काम को बुलाए जाने के बाद अचानक समाप्त हो गया है। – truthseeker

+0

निम्नलिखित कोड द्वारा हल किया गया: सार्वजनिक शून्य निपटान() { मार्शल। रिलीज (internal_interface_ptr); internal_interface_ptr = IntPtr.Zero; मार्शल। रिलीकॉमॉम ऑब्जेक्ट (आंतरिक_इंटरफेस); internal_interface = null; } – truthseeker

+0

मुझे पूरा यकीन नहीं है कि "चमत्कार के रूप में क्रैशिंग" के रूप में आपका क्या मतलब है। मुझे लगता है कि आपको कचरा कलेक्टर को बुलाए जाने से पहले अपनी सेवाओं को निपटाने के लिए मजबूर होना पड़ सकता है। यह सुनिश्चित करने के लिए जांचें कि या तो ServicesToRun या सेवाओं का निपटान किया जाता है इससे पहले कि कचरा कलेक्टर अन्यथा चल रहा है, आपको कोई अच्छा नहीं लगेगा। – mydogisbox

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