2011-02-28 13 views
8

मुझे अपने .NET4 ऐप से Office दस्तावेज़ (Word & एक्सेल) स्वचालित करने की आवश्यकता है।सी # .Net4: उचित रूप से निपटान (गतिशील) COM ऑब्जेक्ट्स

चूंकि मैं वास्तव में अपने उपयोगकर्ताओं को एक विशिष्ट कार्यालय संस्करण का उपयोग करने के लिए मजबूर नहीं कर सकता हूं, इसलिए मैं इंटरऑप असेंबली या tlbimp का उपयोग नहीं करता हूं, इसलिए मेरे प्रोजेक्ट में कोई अतिरिक्त संदर्भ नहीं है और न ही संपूर्ण ऐप विफल हो जाएगा यदि कार्यालय स्थापित नहीं है (सुविधा बस उपलब्ध नहीं होगी)।

dynamic app = Activator.CreateInstance(Type.GetTypeFromProgID("Word.Application")); 
app.Foo(); 

मैं चिंतित जब मैं कैसे ठीक "एप्लिकेशन" वस्तु के निपटान के लिए कर रहा हूँ:

इसके बजाय मैं प्रणाली है जो COM सर्वर "Word.Application" या "Excel.Application" संभाल कर सकते हैं पूछना मैंने इसके साथ किया, क्योंकि अब मेरे पास चिंता करने के लिए दो आंतरिक प्रबंधन प्रणालियां हैं (COM संदर्भ गिनती और .NET संदर्भ ट्रैकिंग)। आदर्श रूप में मैं गतिशील ऐप ऑब्जेक्ट को एक डिस्पोजेबल रैपर क्लास में लपेटने में सक्षम होना चाहिए और यह सुनिश्चित करने के लिए कि आवरणकारी COM ऑब्जेक्ट को संदर्भित किया जाता है जब रैपर का निपटारा किया जाता है।

संपादित करें: मैं यह भी जानना चाहता हूं कि जब मैं इसके साथ काम कर रहा हूं, तो COM ऑब्जेक्ट को "लाइव" पर ठीक से कैसे बनाना है, क्योंकि Word एक अलग प्रक्रिया में है। मुझे वर्ड ऐप को तुरंत चालू करने, इसे स्वचालित करने और फिर मेरे सभी संदर्भों को मुक्त करने में सक्षम होना चाहिए, लेकिन वर्ड ऐप को खुला रहना चाहिए।

+0

संभव डुप्लिकेट: http://stackoverflow.com/questions/2203968/how-to-access-microsoft-word-existing-instance-using-late-binding –

+2

ज़रूरी नहीं है, डुप्लिकेट उम्मीदवार अधिक है सी # से COM के तत्काल पक्ष के बारे में, यह सवाल निपटान के बारे में है। –

+0

सुनिश्चित करें कि आप किसी भी मध्यस्थ COM ऑब्जेक्ट्स का भी निपटान करते हैं - http://stackoverflow.com/a/158752/188926 – Dunc

उत्तर

7

मैं निश्चित रूप से IDisposable लागू करता हूं और इसके अंदर Marshal.ReleaseComObject पर कॉल करता हूं। COM ऑब्जेक्ट को एक से अधिक बार जारी करने से बचने के लिए सुनिश्चित करें कि आप correctly implement the disposable pattern को एक से अधिक बार संदर्भ संख्या को कम करने से बचें, हालांकि इससे कोई फर्क नहीं पड़ता कि आप केवल COM ऑब्जेक्ट का एक उदाहरण बनाने जा रहे हैं। मैंने इस पैटर्न को अतीत में सफलतापूर्वक कार्यान्वित किया है ताकि आप निश्चित रूप से सही दिशा में जा रहे हों।

I सोचें शब्द तब भी खुला रहेगा जब अंतिम COM ऑब्जेक्ट संदर्भ आपके ऐप में 0 तक गिना जाता है, जब तक कि आप इसे स्पष्ट रूप से बाहर निकलने के लिए नहीं कहें। (Word.Application.Close()?)

+0

तो उदाहरण के लिए मैंने मार्शल.फ्रीएचजीलोबल (मूल संसाधन) मार्शल के साथ प्रतिस्थापित करना चाहिए। रिलीकॉमॉम ऑब्जेक्ट (ऐप)? बस? –

+0

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

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