2012-05-10 13 views
13

मैं ऐसे एप्लिकेशन को विकसित कर रहा हूं जो एक्सेस, एक्सेल, वर्ड, पावरपॉइंट और आउटलुक सहित कई माइक्रोसॉफ्ट ऑफिस उत्पादों पर भारी निर्भर करता है। इंटरऑप पर शोध करते समय मुझे पता चला कि वीएस -2010 और .NET 4 से शुरू होने पर, हमें शुक्रिया को पीआईए के दुःस्वप्न से गुजरना नहीं है।सी # विशेष रूप से एमएस ऑफिस अनुप्रयोगों में COM इंटरऑप ऑब्जेक्ट्स का उचित निपटान

इसके अलावा, मैं वस्तुओं के उचित निपटान पर बहुत से लेख पढ़ रहा हूं, सबसे समझदार एक this एक लग रहा था।

हालांकि, लेख 5 साल पुराना है और इस विषय पर कई आधिकारिक प्रकाशन नहीं हैं।

' Cleanup: 
GC.Collect() 
GC.WaitForPendingFinalizers() 
GC.Collect() 
GC.WaitForPendingFinalizers() 

Marshal.FinalReleaseComObject(worksheet) 

oWB.Close(SaveChanges:=False) 
Marshal.FinalReleaseComObject(workbook) 

oApp.Quit() 
Marshal.FinalReleaseComObject(application) 

क्या मैं जानना चाहता हूँ वर्तमान मानकों के अनुसार है, यह कैसे सही है और क्या मैं अगर मैं आने वाले कुछ के लिए अपने आवेदन का समर्थन करने की उम्मीद के लिए बाहर देखना चाहिए: यहाँ ऊपर के लिंक से कोड का एक नमूना है वर्षों?

अद्यतन: कुछ विश्वसनीय लेखों के लिंक की अत्यधिक सराहना की जाएगी। वैसे, यह सर्वर साइड एप्लिकेशन नहीं है। यह कंप्यूटर प्रयोगशालाओं में चल रहा है जहां हमारे पास उपयोगकर्ता कार्यालय कार्यालयों के साथ बातचीत करते हैं जिन्हें हम उनके लिए तत्काल बनाते हैं।

इसे प्राप्त करें:This तीन-भाग लेख शायद एक आधिकारिक खाते के सबसे नज़दीक है जिसे मैं ढूंढने की उम्मीद करता हूं।

+0

आपका ऐप चलने के दौरान आपको ऑब्जेक्ट्स को रिलीज़ करने की आवश्यकता क्यों है? जब आपका ऐप निकलता है तो ऑफिस एप्लिकेशन बंद हो जाएगा। – adrianm

+1

हां मुझे पता है कि ऐप डोमेन के उतारने पर उचित जीसी किया जाएगा। हालांकि, मेरा परिदृश्य एक सर्वर-साइड ऐप और न ही एक ऑफ क्लाइंट ऐप है। यह एक मिश्रण है जहां मुझे यह सुनिश्चित करने की ज़रूरत है कि अगले उपयोगकर्ता को समायोजित करने से पहले किसी भी खुले इंस्टेंस को ठीक से बंद कर दिया गया हो। –

+1

इसी तरह के विषय पर: http://stackoverflow.com/questions/158706/how-to-properly-clean-up-excel-interop-objects/159419#159419 – rkagerer

उत्तर

2

उपयोग कर सकते हैं कार्यालय के संस्करण आप इंटरॉप के माध्यम से नियंत्रित कर रहे हैं पर निर्भर करता है, और परिस्थितियों है कि सर्वर पर पाए जाते हैं, हाँ, आप कुछ गंभीर convolutions करने के लिए आवश्यकता हो सकती है कार्यालय अनुप्रयोगों में से किसी एक के चल रहे उदाहरण से छुटकारा पाने के लिए। अप्रत्याशित (और अनावश्यक) संवाद हैं, उदाहरण के लिए, जब Word इंटरैक्टिव नहीं होता है तो Word खुल जाएगा (Office अनुप्रयोगों में से कोई भी विशेष रूप से अप्रत्याशित निष्पादन के लिए डिज़ाइन नहीं किया गया है, इस प्रकार अनुशंसा है कि नवीनतम संस्करणों के साथ भी जिन्हें वे इंस्टॉल नहीं किया जाए सर्वर-साइड उपयोग)।

सर्वर के मामलों के लिए, कार्यालय के बजाय Aspose के ढेर का उपयोग करने पर विचार करें, या विकल्पों में से एक। इंटरैक्टिव, स्थानीय उपयोग के मामलों, आपको अवसर पर "अतिरिक्त जोरदार हत्या" की आवश्यकता हो सकती है क्योंकि कार्यालय स्वचालन सर्वर विशेष रूप से बुरी तरह से अप्रबंधित वस्तुओं का व्यवहार कर रहे हैं।

3

ऑब्जेक्ट को जीसी द्वारा स्वचालित रूप से निपटान किया जाना चाहिए जब वस्तु दायरे से बाहर हो जाती है। आप उन्हें जल्दी ही रिलीज करने के लिए की जरूरत है, तो आप Marshal.ReleaseComObject http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.releasecomobject.aspx

+3

http://blogs.msdn.com/b/visualstudio/archive/2010/03/01/marshal-releasecomobject-cononsidered-dangerous.aspx –

+0

बहुत बढ़िया, रिलीजकॉम ऑब्जेक्ट डॉक्स में उस सुंदरता का उल्लेख नहीं है ... –

2

यदि आप विशेष रूप से एमएस ऑफिस COM ऑब्जेक्ट्स में COM ऑब्जेक्ट्स को रिलीज़ करना चाहते हैं, तो इसकी अत्यधिक अनुशंसा की जाती है कि आप उन उप ऑब्जेक्ट्स को रिलीज़ करें जिन्हें आपने मूल ऑब्जेक्ट्स के अंदर उपयोग किया होगा।

आपके उदाहरण में, मैं कहूंगा कि सेल, रेंज या किसी अन्य ऑब्जेक्ट से संबंधित वर्कशीट को जारी करने से पहले आप किसी भी अन्य ऑब्जेक्ट को रेंज कर सकते हैं।