正确closuresC#excel COM对象

我想正确closuresExcel的COM对象,如Excel应用程序工作簿和工作表。 我浏览了本网站和其他网站上的所有解决scheme。 没有任何工作 唯一的办法是运行一个循环来杀死或优化进程。 有没有更好的方法或杀死只有一个Excel文件的过程?

#region VARIABLE int nColumn = 0; int nIMPORT = 1; int endofsheet = 0; string IMPORTfilepath = null; string nsheet = null; string nCell = null; string lastfilename = ""; double rRFDS = 0; double cRFDS = 0; List<String> filename = new List<String>(); object misValue1 = System.Reflection.Missing.Value; //Opening Central DB Excel.Application CentralDB; Excel.Workbook CentralDBWorkBook; Excel.Worksheet CentralDBWorkSheet; Excel.Range CentralDBrange; //Opening RFDS Excel.Application IMPORT; Excel.Workbook IMPORTWorkBook; Excel.Worksheet IMPORTWorkSheet; //Excel.Range RFDSrange; Excel.Range CellAddress; #endregion CentralDB = new Microsoft.Office.Interop.Excel.Application(); CentralDBWorkBook = CentralDB.Workbooks.Open(Odl1.FileName, 0, false, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0); CentralDBWorkSheet = CentralDB.Worksheets.get_Item(1); IMPORT = new Microsoft.Office.Interop.Excel.Application(); IMPORTfilepath = Odl2.FileNames[nIMPORT]; IMPORTWorkBook = IMPORT.Workbooks.Open(IMPORTfilepath, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0); IMPORTWorkSheet = IMPORT.Worksheets.get_Item(1); CentralDBrange = CentralDBWorkSheet.UsedRange; filename = Odl2.FileNames.ToList(); endofsheet = CentralDBrange.Rows.Count; foreach(string fn in filename) { try { IMPORTWorkBook = IMPORT.Workbooks.Open(fn, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0); CentralDBWorkSheet.Cells[nIMPORT + endofsheet, 1] = IMPORTWorkBook.Name; for (nColumn = 3; nColumn <= CentralDBrange.Columns.Count; nColumn++) { nsheet = (string)(CentralDBrange.Cells[2, nColumn].Value2); foreach (Excel.Worksheet ws in IMPORTWorkBook.Sheets) { if (ws.Name.Equals(nsheet)) { IMPORTWorkSheet = IMPORTWorkBook.Worksheets.get_Item(nsheet); nCell = (string)(CentralDBrange.Cells[3, nColumn].Value2); CellAddress = CentralDBWorkSheet.get_Range(nCell, nCell); rRFDS = CellAddress.Row; cRFDS = CellAddress.Column; CentralDBWorkSheet.Cells[nIMPORT + endofsheet, nColumn] = IMPORTWorkSheet.Cells[rRFDS, cRFDS]; label4.Text = nIMPORT.ToString() + "/" + Convert.ToString(Odl2.FileNames.Count()); } } } nIMPORT++; nColumn = 3; CentralDBWorkBook.Save(); IMPORTWorkBook.Close(false, null, null); } catch (System.Exception ex) { MessageBox.Show("Unable to release the Object " + ex.ToString()); } lastfilename = fn; } CentralDB.Quit(); releaseObject(CentralDBWorkSheet); releaseObject(CentralDBWorkBook); releaseObject(CentralDB); IMPORT.Quit(); releaseObject(IMPORTWorkSheet); releaseObject(IMPORTWorkBook); releaseObject(IMPORT); GC.Collect(); } private void releaseObject(object obj) { try { System.Runtime.InteropServices.Marshal.ReleaseComObject(obj); obj = null; } catch (System.Exception ex) { obj = null; MessageBox.Show("Unable to release the Object " + ex.ToString()); } finally { GC.Collect(); } } 

试试这个命令(加上.Visible = false ):

  releaseObject(CentralDBWorkSheet); releaseObject(CentralDBWorkBook); releaseObject(IMPORTWorkSheet); releaseObject(IMPORTWorkBook); CentralDB.Visible = false; IMPORT.Visible = false; CentralDB.Quit(); IMPORT.Quit(); releaseObject(CentralDB); releaseObject(IMPORT); 

除了我的评论…我使用这个,工作很好…但是,我没有参考在全国各地举行。

 private void DoReleaseCOMObject(object obj) { int refCounter = Marshal.ReleaseComObject(obj); while (refCounter > 0) { refCounter = Marshal.ReleaseComObject(obj); System.Diagnostics.Debug.WriteLine("ReleaseCOM ref: " + refCounter); } obj = null; } private void DoFinalReleaseCOMObject(object obj) { int refCounter = Marshal.FinalReleaseComObject(obj); System.Diagnostics.Debug.WriteLine("FinalReleaseComObject ref: " + refCounter); obj = null; } public void Dispose() { System.Diagnostics.Debug.WriteLine("In Dispose"); this.Dispose(false); // because we are doing unmanaged GC.Collect(); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { System.Diagnostics.Debug.WriteLine("In Dispose (" + disposing + ")"); if (!disposing) // unmanaged { #region COM Cleanup this.DoFinalReleaseCOMObject(this.headerStartCell); this.DoFinalReleaseCOMObject(this.headerEndCell); this.DoFinalReleaseCOMObject(this.headerWriteRange); this.DoFinalReleaseCOMObject(this.startCell); this.DoFinalReleaseCOMObject(this.endCell); this.DoFinalReleaseCOMObject(this.writeRange); this.DoFinalReleaseCOMObject(this.ws); this.DoFinalReleaseCOMObject(this.wb); this.DoFinalReleaseCOMObject(this.wbs); this.DoFinalReleaseCOMObject(this.excelApp); System.Diagnostics.Debug.WriteLine("I've tried to clean"); #endregion } // no need for else condition if dispose is true as we are not dealing with managed objects } 

是的,我实现了IDisposable接口。 我也有一些引用/全球举行的Excel对象(相同的实例),这就是我正在清理我退出Excel