2012-10-25 15 views
6

के कारण मेमोरी लीक को संभालना मुझे बाहरी असेंबली का उपयोग करने की आवश्यकता है जिसे मैं संशोधित नहीं कर सकता। मान लीजिए कि मैं बहुत तरह कि विधानसभा से एक वर्ग का उपयोग करें:बाहरी असेंबली

using (ExternalWidget widget = new ExternalWidget()) 
{ 
    widget.DoSomething(); 
} 

हर बार जब मैं इस कोड कहते हैं, यह अप्रबंधित स्मृति लीक। ExternalWidget लागू IDisposable और मैंने इसे using कथन में लपेट लिया है, लेकिन ExternalWidget अपने अप्रबंधित संसाधनों को साफ़ नहीं करता है।

चूंकि मेरे पास ExternalWidget कोड तक पहुंच नहीं है, इसलिए मैं इस समस्या को सही तरीके से ठीक नहीं कर सकता। क्या कोई अन्य तरीका है कि मैं ExternalWidget द्वारा उपयोग किए गए मेमोरी संसाधनों को मुक्त कर सकता हूं?

+0

समस्या का प्रदर्शन करने और पुस्तकालय के लेखक से संपर्क करने वाला एक छोटा सा नमूना प्रोग्राम बनाएं। – Henrik

+1

यदि आप मेमोरी लीक का कारण जानते हैं, तो आप शायद इसे ठीक करने के लिए प्रतिबिंब का उपयोग कर सकते हैं (हमें इन्फ्राजिस्टिक्स कंट्रोल लाइब्रेरी के पुराने संस्करण के साथ ऐसा करना था)। – sloth

+0

आप कैसे जानते हैं कि यह अप्रबंधित संसाधनों की सफाई नहीं कर रहा है? –

उत्तर

4

यदि यह सच है अप्रबंधित स्मृति रिसाव और आप कोड नहीं बदल सकते हैं, तो आप ऐसा कर सकते हैं जो आप कर सकते हैं। ढांचा उस पर नहीं उठा सकता है, न ही यह कोड साफ़ कर सकता है।

इस मामले में दृष्टिकोण उस घटक का अलगाव होगा। इसका मतलब है कि इसे एक्सेस करने में बहुत अधिक ओवरहेड होने जा रहा है, लेकिन ऐसा कुछ भी नहीं है जो आप कर सकते हैं।

आप किसी अन्य एप्लिकेशन डोमेन में कोड नहीं चला सकते हैं, क्योंकि अप्रबंधित कोड में एप्लिकेशन डोमेन की कोई अवधारणा नहीं है।

जो प्रक्रिया स्तर को छोड़ देता है। मैं डब्ल्यूसीएफ में एक सेवा अनुबंध बनाने की सिफारिश करता हूं जो ExternalWidget पर Shutdown विधि के साथ कॉल की नकल करता है।

फिर, आप एक EXE तैयार करेंगे जो इस अनुबंध को बेनकाब करेगा (एक सत्र के साथ, ताकि आप ExternalWidget इंस्टेंस पर रख सकें, जब तक कि प्रत्येक कॉल स्टेटलेस नहीं हो) नामित पाइप बाइंडिंग के माध्यम से।

EXE के पैरामीटर के रूप में, यह एक अद्वितीय पहचानकर्ता (Guid का उपयोग करें) का उपयोग करेगा और डब्ल्यूसीएफ सेवा के लिए एंडपॉइंट स्थापित करने के हिस्से के रूप में इसका उपयोग करेगा।

फिर, आप कॉल करेंगे, और जब आप ExternalWidget के उस उदाहरण के साथ किए जाते हैं, तो Shutdown पर कॉल करें; EXE प्रतीक्षा करना बंद कर देगा और फिर प्रक्रिया बाहर निकल जाएगी, और ऑपरेटिंग सिस्टम स्मृति को पुनः प्राप्त करेगा।

बेशक, विशाल ओवरहेड की मात्रा यहां है, इसलिए यदि आपको लगता है कि आप बहुत सी कॉल कर रहे हैं और कॉल के प्रत्येक सेट के लिए नई प्रक्रिया की आवश्यकता नहीं है, तो आप विचार को एक विस्तार में विस्तारित कर सकते हैं सेवा जो कॉल की गणना करती है और फिर प्रक्रिया को फिर से चलाती है (सेवा को अभी भी खोलना होगा, या संसाधनों से बाहर हो जाएगा) आवश्यक होने पर।

ध्यान दें कि यदि यह प्रबंधित मेमोरी समस्या है, तो आप हमेशा एक नया एप्लिकेशन डोमेन स्पिन कर सकते हैं, अपना कोड वहां चला सकते हैं (आवश्यकतानुसार परिणामों को आगे बढ़ा सकते हैं) और फिर एप्लिकेशन डोमेन को छोड़ दें ।

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