2016-07-06 70 views
3

我正在使用下面的方法。执行此代码块后,我发现Microsoft Excel仍然通过检查任务管理器在后台运行。Excel互操作对象不被释放

编辑:正好一个 Microsoft Excel后台进程仍然存在。我刚刚添加了这个功能,因为当我第一次开始使用Excel和Interop COM对象时,有时许多进程将在函数完成执行后继续运行。

如何确保在我的当前函数执行后Excel不会在后台运行?


,因为一些功能最终需要他们,我声明这些变量具有全局范围:

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(); 
} 
+0

又一个不了解垃圾收集器如何工作的例子。这里已经覆盖了很多次,[喜欢这里](http://stackoverflow.com/questions/25134024/clean-up-excel-interop-objects-with-idisposable/25135685#25135685)。 –

回答

-1

我希望看到一个合适的解决方案,但这种破解是我能够实现它的唯一方法。看起来,互操作库在告诉时关闭流程时并不擅长。如果在线程中运行,则会为每个线程启动进程。通过按名称扫描进程并跟踪新进程,我会跟踪进程ID。我在服务器上这样做,所以我知道所有进程都是互操作启动的,而不是由实际用户启动的。在我完成逻辑之后,我会启动一个计时器,每分钟都会尝试终止进程。最终它会关闭它。我还有一些代码可以在启动时终止任何Excel进程,以防上次运行应用程序时未正确处理它们。

让我知道你是否想要通过名称或ID查杀进程的示例代码。我没有现成的,或快速的搜索应该带来一些好的样本。

+0

选民请解释。这可能不是一个理想的解决方案,但它确实有效。我甚至提到我也想知道一个理想的解决方案。 – ManOVision