C#Excel Interop:Excel过程保留在内存中,直到父窗体closures

以我的forms,我正在做一些简单的事情

private void btnPrintPickList_Click(object sender, EventArgs e) { using (var salesRpt = new SalesOrder(CurrentItem())) { salesRpt.CreateSpreadSheet(); salesRpt.Dispose(); } } 

我已经遵循了“优秀互操作规范”。

 protected ExcelSheet(bool documentVisible, XlPageOrientation orientation) { ExcelApplication = new Application {Visible = documentVisible}; WorkBooks = ExcelApplication.Workbooks; WorkBook = WorkBooks.Add(XlSheetType.xlWorksheet); SheetList = WorkBook.Worksheets; Orientation = orientation; WorkSheet = (Worksheet) ExcelApplication.ActiveSheet; } public Application ExcelApplication { get; private set; } public Workbook WorkBook { get; private set; } public Workbooks WorkBooks { get; private set; } public Worksheet WorkSheet { get; private set; } public Sheets SheetList { get; private set; } public XlPageOrientation Orientation { get; private set; } 

处置方法执行以下操作。

  public void Dispose() { for (int i = 1; i <= SheetList.Count; i++) { Marshal.FinalReleaseComObject(SheetList[i]); } //Marshal.FinalReleaseComObject(WorkSheet); Marshal.FinalReleaseComObject(SheetList); Marshal.FinalReleaseComObject(WorkBook); WorkBooks.Close(); Marshal.FinalReleaseComObject(WorkBooks); ExcelApplication.Quit(); Marshal.FinalReleaseComObject(ExcelApplication); WorkSheet = null; SheetList = null; WorkBook = null; WorkBooks = null; ExcelApplication = null; } 

在我的testing中,一旦打印Excel电子表格,EXCEL.exe过程不会始终从任务栏的当前进程中删除。

我究竟做错了什么?

你有没有尝试过调用GC.Collect()?

或者,如果您不想强制所有代的即时垃圾收集,则可以使用using{}