सभी इन सवालों के:आवरण वस्तुओं का उपयोग करना ठीक एक्सेल इंटरॉप साफ करने के लिए वस्तुओं
- Excel 2007 Hangs When Closing via .NET
- How to properly clean up Excel interop objects in C#
- How to properly clean up interop objects in C#
समस्या यह है कि सी # एक्सेल जारी नहीं करता है के साथ संघर्ष COM का उपयोग करने के बाद ठीक से वस्तुओं। इस मुद्दे के आसपास काम करने के मुख्य रूप से दो दिशाएं हैं:
- Excel का उपयोग नहीं होने पर एक्सेल प्रक्रिया को मार दें।
- स्पष्ट रूप से पहले एक चर के लिए उपयोग की जाने वाली प्रत्येक COM ऑब्जेक्ट को स्पष्ट रूप से असाइन करने के लिए सावधानी बरतें और अंततः गारंटी दें कि मार्शल। रिलीज कॉम ऑब्जेक्ट प्रत्येक पर निष्पादित किया जाता है।
कुछ ने कहा है कि 2 बहुत कठिन है और हमेशा कुछ अनिश्चितता है कि क्या आप कोड में कुछ स्थानों पर इस नियम से चिपकना भूल जाते हैं। अभी भी 1 मुझे गंदे और त्रुटि-प्रतीत होता है, मुझे लगता है कि एक प्रतिबंधित वातावरण में एक प्रक्रिया को मारने की कोशिश कर एक सुरक्षा त्रुटि उठा सकता है।
तो मैं सोच रहा है के बारे में एक और प्रॉक्सी ऑब्जेक्ट मॉडल जो एक्सेल ऑब्जेक्ट मॉडल की नकल करता बनाकर 2 सुलझाने (मेरे लिए, यह वस्तुओं मैं वास्तव में जरूरत है लागू करने के लिए पर्याप्त होगा)। सिद्धांत निम्नानुसार दिखेगा:
- प्रत्येक एक्सेल इंटरऑप क्लास में इसकी प्रॉक्सी है जो उस वर्ग की ऑब्जेक्ट को लपेटती है।
- प्रॉक्सी COM ऑब्जेक्ट को इसके अंतिम रूप में रिलीज़ करता है।
- प्रॉक्सी इंटरऑप कक्षा के इंटरफ़ेस की नकल करता है।
- मूल रूप से COM ऑब्जेक्ट लौटाए गए किसी भी तरीके को बदले में प्रॉक्सी वापस करने के लिए बदला जाता है। अन्य विधियां केवल आंतरिक COM ऑब्जेक्ट को कार्यान्वयन का प्रतिनिधित्व करती हैं।
उदाहरण:
public class Application
{
private Microsoft.Office.Interop.Excel.Application innerApplication
= new Microsoft.Office.Interop.Excel.Application innerApplication();
~Application()
{
Marshal.ReleaseCOMObject(innerApplication);
innerApplication = null;
}
public Workbooks Workbooks
{
get { return new Workbooks(innerApplication.Workbooks); }
}
}
public class Workbooks
{
private Microsoft.Office.Interop.Excel.Workbooks innerWorkbooks;
Workbooks(Microsoft.Office.Interop.Excel.Workbooks innerWorkbooks)
{
this.innerWorkbooks = innerWorkbooks;
}
~Workbooks()
{
Marshal.ReleaseCOMObject(innerWorkbooks);
innerWorkbooks = null;
}
}
आप के लिए मेरे सवालों का विशेष रूप से कर रहे हैं:
- कौन इस एक बुरा विचार पाता है और क्यों?
- यह एक गहरा विचार कौन पाता है? यदि हां, तो किसी ने अभी तक ऐसे मॉडल को लागू/प्रकाशित क्यों नहीं किया है? क्या यह केवल प्रयास के कारण है, या क्या मुझे उस विचार के साथ एक हत्या की समस्या याद आ रही है?
- क्या यह फाइनल में रिलीजकॉम ऑब्जेक्ट करने के लिए असंभव/खराब/त्रुटि-प्रवण है? (मैंने केवल इसे अंतिम रूप में एक निपटान() में डालने के प्रस्तावों को देखा है - क्यों?)
- यदि दृष्टिकोण समझ में आता है, तो इसे सुधारने के लिए कोई सुझाव?
आप मूलधन में finalizer साथ ठीक कह रहे हैं, लेकिन इस विशेष स्थिति में मैं कह सकते हैं: चलो कचरा कलेक्टर को ज़िम्मेदारी सौंपना है, के कारण के बाद से फाइनलइज़र मैं जीसी पर भरोसा कर सकता हूं जैसे ही ऑब्जेक्ट ऑब्जेक्ट नष्ट हो जाता है, COM COM ऑब्जेक्ट को भी जारी कर सकता है। अगर मैं कोड पर किसी स्थान पर सभी संसाधनों को स्पष्ट रूप से रिलीज़ करना चाहता हूं, तो मैं जीसी.कोलेक्ट() का उपयोग कर सकता हूं। – chiccodoro
@chiccodoro: इस विधि के साथ समस्या यह है कि यह जीसी के कार्यान्वयन विवरण पर निर्भर है। यदि जीसी थोड़ा बदलता है तो यह अब काम नहीं कर सकता है। लेकिन मैं इस स्थिति में इसे ठीक से करने में कठिनाई को समझता हूं, और यह कि कुछ स्थितियों में हैक सबसे अधिक लागत प्रभावी समाधान हो सकता है। –
हम्म। में तुम्हारी बात समझ रहा हूँ। लेकिन प्रत्येक एकल बिंदु के लिए एक उपयोग() का उपयोग करना कठिन है। हो सकता है कि एक्सेल पर केवल एक डिस्प्ले() विधि को परिभाषित करें। आवेदन जो जीसी.कोलेक्ट() चलाता है ताकि इस बिंदु पर अन्य सभी एक्सेल ऑब्जेक्ट भी जारी किए जा सकें? एक्सेल तक। आवेदन "उपयोग" दायरे को छोड़ देता है, मुझे अपने प्रोग्राम को COM संसाधनों को रिलीज़ करने की आवश्यकता नहीं होती है जो एप्लिकेशन से निकलती हैं। – chiccodoro