2010-10-11 15 views
8

मुझे एक दुर्व्यवहार लाइब्रेरी के साथ परेशानी हो रही है जो एक अंतिमकर्ता में अपवाद फेंकता है, जो निश्चित रूप से एप्लिकेशन को दुर्घटनाग्रस्त करता है।क्या मैं एप्लिकेशन को बंद करने से किसी अन्य ऐपडोमेन में एक अपरिचित अपवाद को रोक सकता हूं?

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

एमएसडीएन पर प्रलेखित के रूप में, AppDomain.UnhandledException पर पंजीकरण करने से अपवाद को रोकने से रोका नहीं जाता है, लेकिन मुझे आश्चर्य है कि "उप ऐपडोमेन" में इस तरह के अपवाद को पकड़ने का कोई और तरीका नहीं है।

प्लगइन होस्ट या एप्लिकेशन जो ऐप्पडोमेन्स का उपयोग सैंडबॉक्स संभावित रूप से हानिकारक कोड में करते हैं, अनचाहे अपवादों को रोकने के लिए करते हैं? क्या यह वास्तव में संभव है?

नोट: मेरे पास पहले से ही एक और कामकाज है, जिसने here का वर्णन किया है। खराब फ़ाइनलाइज़र एक लंबे समय तक जीवित वस्तु पर है, जो कि शट डाउन के दौरान ही एकत्र किया जाता है, इसलिए उपयोगकर्ता से इस "बोगस" त्रुटि को छिपाने के लिए पर्याप्त है। फिर भी, मुझे यह कामकाज भंगुर लगता है, क्योंकि यह ऑब्जेक्ट पहले एकत्र किए जाने पर अन्य अनुप्रयोगों को वास्तविक, वास्तविक त्रुटियों या जोखिम को छुपाएगा।

+0

आप अपवाद को क्यों नहीं पकड़ सकते – rerun

+0

अपवाद को फाइनेंजर में फेंक दिया गया है, जो सीएलआर द्वारा प्रबंधित अपने स्वयं के धागे में चलाया जाता है, इसलिए मैं थ्रेड पर अपवाद हैंडलर नहीं डाल सकता। साथ ही, यह "विरासत, अनैच्छिक और महत्वपूर्ण घटक के साथ कोई स्रोत कोड उपलब्ध नहीं है" की एक लाइब्रेरी है ... –

उत्तर

4

एक ऐपडोमेन अच्छा है क्योंकि आप प्रोग्राम स्थिति को हटा सकते हैं लेकिन आपको अभी भी समस्या है कि धागा मर चुका है। यह फ़ाइनलाइज़र थ्रेड पर होता है घातक है, सीएलआर प्रक्रिया के बिना प्रक्रिया को निरस्त कर देगा।

एकमात्र 'फिक्स' इस घटक को अपनी प्रक्रिया में चलाने के लिए है। प्रक्रिया निकास पर चलने से फाइनलाइज़र थ्रेड को रोकने के लिए आप इसे प्रोसेस.किल() के साथ सिर में शूट कर सकते हैं। इंटरप्रोसेस संचार तंत्रों में से एक का उपयोग करें जो .NET इससे बात करने के लिए समर्थन करता है। पाइप, रीमोटिंग या डब्ल्यूसीएफ नामक एक सॉकेट। इसके साथ गुड लक।

+0

उत्तर के लिए धन्यवाद, मैंने सोचा कि ऐपडोमेन के बीच एक बेहतर अलगाव था, बहुत बुरा। मुझे लगता है कि हम अभी के लिए वर्तमान कार्यवाही के साथ रहेंगे, और पुस्तकालय को अपने संस्करण में अगले संस्करण में अलग कर देंगे। –

0

दरअसल, .NET 1.0/1.1 में वापस, यह आपको आवश्यकतानुसार व्यवहार करता था। तुम अब भी बस "क्रम" नोड के अंदर, आपके आवेदन विन्यास फाइल के लिए इस पंक्ति जोड़कर इस व्यवहार करने के लिए वापस कर सकते हैं:

<runtime> 
    <legacyUnhandledExceptionPolicy enabled="1"/> 
</runtime> 

इस पूरी प्रक्रिया को समाप्त करने से एक अलग थ्रेड में एक बिना क्रिया का अपवाद नहीं कर पाएगा।

+2

मुझे इस विकल्प के बारे में पता है, लेकिन यह हर धागे से अपवाद छुपाएगा, जो निश्चित रूप से मैं नहीं चाहता हूं। –

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

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