2012-11-18 25 views
5

मैं असेंबली लोड करने के लिए ऐपडोमेन का उपयोग कर रहा हूं और फिर उन्हें अनलोड कर रहा हूं।AppDomain अनलोड के बाद असेंबली असंबद्ध नहीं है?

हालांकि, मुझे बहुत ही कठिन समस्या है। AppDomain अनलोड होने के बाद - मैं अभी भी प्रक्रिया एक्सप्लोरर में देख सकता हूं कि कुछ असेंबली कई बार लोड की जाती हैं! लोड किए गए असेंबली के रहने वाले क्यों हैं? AppDomain नहीं है। अपलोड करें सभी AppDomain की लोड की गई स्मृति को मुक्त करता है?

आप संलग्न चित्र में दिखाई दे सकते हैं:

कुल AppDomains हैं 3

AppDomains (मैं इस प्रक्रिया के जीवन चक्र में 3 AppDomains बनाया): 1 (वर्तमान में केवल 1 AppDomain मौजूद है)

और किसी कारण से, आप लोड DLL अनुभाग bellow में देख सकते हैं - विधानसभाओं प्रक्रिया में कई बार लोड किए गए हैं ..

कोड:

AppDomain fetcherDomain = AppDomain.CreateDomain("StatusFetcher"); 
try 
{ 
    var fetcher = (LocalStatusFetcher)fetcherDomain.CreateInstanceFromAndUnwrap(Assembly.GetExecutingAssembly().CodeBase, typeof(LocalStatusFetcher).FullName); 
    //doing some other stuff that is not interesting... 
} 
finally 
{ 
    AppDomain.Unload(fetcherDomain); 
} 

और हाँ, LocalStatusFetcher MarshalByRefObject वारिस है ...

enter image description here

+0

शायद आप अपने मुख्य ऐपडोमेन में असेंबली लोड कर रहे हैं। वैसे, छवि संकल्प बहुत कम है और मैं कुछ भी नहीं देख सकता। –

+0

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

+0

आपके स्क्रीन-शॉट से दिखाई देने वाली असेंबली सभी .NET Framework असेंबली हैं। क्या यह आपके असेंबली के साथ भी होता है? –

उत्तर

2

वहाँ एक बहुत ही उच्च संभावना है कि विधानसभाओं आप विदेशी आवेदन डोमेन में लोड कर रहे हैं वर्तमान में ब्लेड जाने लगा है। टन इस तरीके से हो सकते हैं, लेकिन विशेष रूप से आपकी समस्या Assembly.GetExecutingAssembly().CodeBaseCreateInstanceFromAndUnwrap विधि से गुज़र रही है। Assembly.GetExecutingAssembly() को एक कॉल वर्तमान एप्लिकेशन डोमेन में वर्तमान में क्रियान्वित विधानसभा लोड करता है, और CreateInstanceFromAndUnwrap को .CodeBase संपत्ति गुजर instantiating से पहले लक्ष्य डोमेन में लक्ष्य विधानसभा (आवेदन पथ में या GAC में स्थित है) लोड करने का प्रयास करेंगे अपने लक्ष्य प्रॉक्सी। वर्तमान में, मुझे संभावित रक्तस्राव के मुद्दे के अलावा इस कोड के साथ कुछ भी गलत नहीं लगता है।

यदि आपके पास एकाधिक एप्लिकेशन डोमेन हैं तो आपको लोडफ्रॉम संदर्भ में असेंबली की कई प्रतियां दिखाई देगी क्योंकि केवल एपडॉमेन्स में साझा की गई असेंबली mscorlib.dll है। जब तक मैं आपके प्रश्न को गलत समझ नहीं पा रहा हूं, मुझे लगता है कि आप जो देख रहे हैं वह सामान्य है।

+0

वर्तमान असेंबली पहले से ही वर्तमान ऐप डोमेन पर लोड हो चुकी है, इसलिए मुझे नहीं पता कि GetExecutingAssembly को कॉल करने में समस्याग्रस्त हो सकता है। इसके अलावा, मुझे पता है कि अन्य ऐप डोमेन इन असेंबली को लोड करेगा, जो मुझे समझ में नहीं आता है, यह क्यों किया जाता है जब यह उन्हें जारी नहीं करता है? मुझे नहीं लगता कि जो मैं देख रहा हूं वह सामान्य है - ऐप डोमेन की अवधारणा यह है कि इसे रिलीज़ होने के बाद - इसमें लोड की गई सभी असेंबली भी जारी की जाती हैं ... –

+0

1. आप उन्हें वैकल्पिक रूप से कैसे लोड कर रहे हैं ऐप डोमेन? 2. क्या आप वर्तमान ऐप डोमेन में किसी भी संदर्भ में लोड असेंबली का संदर्भ दे रहे हैं? – Jduv

+0

मैं उन्हें संदर्भित कर रहा हूं और वर्तमान संदर्भ में उनका उपयोग कर रहा हूं। ये कोई समस्या नहीं है। मैं उन्हें लोड होने की उम्मीद करता हूं - सवाल यह है कि वे दो बार क्यों लोड होते हैं? मैंने अन्य ऐपडोमेन को उतार दिया, उन्हें केवल एक बार लोड होने के लिए वापस जाना चाहिए। –