Excel互操作对象不被释放
我正在使用下面的方法。 在这个代码块执行后,我发现Microsoft Excel仍然通过检查任务pipe理器在后台运行。
编辑 :完全一个 Microsoft Excel后台进程仍然生活。 我刚刚添加了这个function,因为当我第一次开始使用Excel和Interop COM对象时,有时很多进程在函数执行完成后仍然保持运行。
如何确保在执行当前函数后Excel不在后台运行?
我用全局范围声明这些variables,因为几个函数最终需要它们:
private Excel.Application xls = null; private Excel.Workbooks workBooks = null; private Excel.Workbook workBook = null; private Excel.Sheets sheets = null; private Excel.Worksheet workSheet = null;
此方法用于检查给定工作簿中是否存在工作表:
private bool sheetExists(string searchString) { xls = new Excel.Application(); workBooks = xls.Workbooks; workBook = workBooks.Open(workbookPath); // <- Where the workbook is saved sheets = workBook.Sheets; bool isFound = false; foreach (Excel.Worksheet sheet in sheets) { // Check the name of the current sheet if (sheet.Name == searchString) { Marshal.ReleaseComObject(sheet); isFound = true; break; } Marshal.ReleaseComObject(sheet); } cleanUp(true, xls, workBooks, workBook, sheets); return isFound; }
这个函数是用来释放COM对象的:
private void cleanUp(bool saveTrueFalse, params object[] comObjects) { workBook.Close(saveTrueFalse); xls.Application.Quit(); xls.Quit(); foreach (object o in comObjects) { Marshal.ReleaseComObject(o); } workSheet = null; sheets = null; workBook = null; workBooks = null; xls = null; GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); GC.WaitForPendingFinalizers(); }
我希望看到一个合适的解决scheme,但是这个破解是我能够实现的唯一方法。 看来,互联网图书馆是不好的在closures过程中告诉时。 如果在线程中运行,则会为每个线程启动进程。 在通过名称扫描进程并跟踪新进程之后,我会跟踪进程ID。 我在服务器上这样做,所以我知道所有的进程是interop开始,而不是由一个实际的用户启动。 在我完成逻辑之后,我会启动一个计时器,每分钟都会尝试终止进程。 最终它会closures它。 我也有一些代码会在启动时终止任何Excel进程,以防上次运行应用程序时不能正确地杀死它们。
让我知道如果你想要通过名称或ID杀死进程的示例代码。 我没有现成的,或快速的search应该带来一些好的样本。
- 将自定义数据存储在Excel中AddIn C#
- 使用infragistics检查工作表是否存在
- Excel 2007:XML:在缺lessss:namespace限定符时窒息
- c#Excel的Application.EnableEvents
- “Microsoft.ACE.OLEDB.12.0”提供程序未在本地计算机上注册,但不适用于Excel,但适用于Access
- 添加选项“自动返回”到我的单元格C#
- Excel.Worksheet.Cells =“=公式”与Range.set_Value(Missing.Value,arrayFormulas)
- 如何从字典中将值添加到电子表格?
- 在c#中读取一些列为空的Excel