का कारण बनता है मैं बहुत व्यस्त एक्सेल कार्यपुस्तिकाओं का एक सेट खोलने के लिए COM इंटरऑप लाइब्रेरी के साथ सी # का उपयोग करने की कोशिश कर रहा हूं। मुझे सी # का उपयोग करना है, क्योंकि मुझे मैक्रोज़ शुरू करने, आसपास के कुछ हिस्सों को स्थानांतरित करने और मेरी कंपनी के उपयोग में एक कस्टम एक्सेल-एड-शुरू करने की आवश्यकता है।सी # एक्सेल स्वचालन एक्सेल मेमोरी लीक
मेरा प्रोग्राम तब बाहर निकलता है, कार्यपुस्तिकाओं को खुला छोड़ देता है, प्रत्येक एक अलग एक्सेल उदाहरण में। मैं नहीं चाहता कि जब प्रोग्राम निकल जाए तो कार्यपुस्तिका बंद हो जाएंगी।
समस्या यह है कि जब मेरा सी # प्रोग्राम निकलता है, समय के साथ, एक्सेल कार्यपुस्तिकाएं धीरे-धीरे अधिक स्मृति का उपभोग करती हैं, जब तक कि वे मूल 500 एमबी से 3.5 गीगा मेमोरी का उपभोग नहीं कर लेते।
मैं कार्यपुस्तिकाओं को हाथ से खोलता था, और चादरों ने कभी भी इतना स्मृति नहीं खाई। एक बार मैंने सी # का उपयोग करके उन्हें खोलना शुरू कर दिया, तो चरम स्मृति उपयोग के कारण वे तोड़ने लगे। मेरा सिद्धांत यह है कि किसी भी तरह, जब मैं COM Excel ऑब्जेक्ट से सहभागिता करता हूं, तो मैं एक स्मृति रिसाव बनाता हूं।
नीचे अपने मूल कोड है:
using Excel = Microsoft.Office.Interop.Excel;
...
excelApp = new Excel.Application();
excelApp.Visible = true;
excelApp.Workbooks.Open(filename, misValue, misValue, misValue, misValue, misValue,
true, misValue, misValue, misValue, misValue, misValue, misValue, misValue, misValue);
excelApp.Calculation = Excel.XlCalculation.xlCalculationAutomatic;
मैं के बारे में है कि कैसे आप का उपयोग करता है जारी करने के लिए मार्शल उपयोग करने की आवश्यकता को पढ़ने, तो मैं अब निम्नलिखित कोड अन्य कोशिश कर रहा हूँ, लेकिन यह परीक्षण करने के लिए कोई आसान तरीका है, सभी चादरें खोलने और देखने से कि वे बहुत अधिक डेटा का उपभोग करते हैं।
excelApp = new Excel.Application();
excelApp.Visible = true;
Excel.Workbooks currWorkbooks = excelApp.Workbooks;
Excel.Workbook currWorkbook = currWorkbooks.Open(filename, misValue, misValue, misValue, misValue, misValue,
true, misValue, misValue, misValue, misValue, misValue, misValue, misValue, misValue);
//excelApp.Calculation = Excel.XlCalculation.xlCalculationAutomatic;
int x = Marshal.ReleaseComObject(currWorkbook);
currWorkbook = null;
int y = Marshal.ReleaseComObject(currWorkbooks);
currWorkbooks = null;
आप पहले से ही currWorkbook को शून्य पर सेट कर चुके हैं .. तो आप इसे दो बार क्यों कर रहे हैं। Mashal.ReleaseComObject (currWorkBook) आपको बस इतना करना है कि आप यह जांचने के लिए एक इंट असाइन करने का प्रयास क्यों कर रहे हैं कि ऑब्जेक्ट जारी किया गया है या नहीं .. क्या आपको कोई त्रुटि मिल रही है .. – MethodMan
मुझे कोई त्रुटि नहीं मिल रही है। समस्या यह है कि कार्यपुस्तिकाएं इस तरह से शुरू हुईं, धीरे-धीरे अधिक से अधिक स्मृति का उपभोग करें। – user804649
आप EPPlus (http://epplus.codeplex.com/) को देखना चाहते हैं। मुझे यकीन नहीं है कि इसमें किस प्रकार का मैक्रो समर्थन है (यह एक फीचर के रूप में वीबीए का उल्लेख करता है), लेकिन आम तौर पर, मुझे एक्सेल इंटरऑप की तुलना में अधिक कुशल और कम परेशानी-प्रवण होने के लिए ईपीप्लस मिल गया है। – devuxer