从任务pipe理器中删除后无法closuresExcel.exe

我在C#中使用Visual Studio 2015社区,而Office 2013是独立的。

下面的代码工作打开和closuresExcel。 然后我添加了代码来打开一个特定的工作表,如下例2所示。 而且,工作,Excel正确closures。

然后,我移动的东西,但忘了使用ReleaseComObject的工作表和Excel保持打开,所以我手动closures它在任务pipe理器。

现在,下面的例子都没有工作。 在我不小心忘记释放COM对象之后,除非重新启动我的机器,否则Excel永远不会closures。

例1

 private bool loadExcel() { // Open Excel Excel.Application myApp = new Excel.Application(); // Hide Excel myApp.Visible = false; GSIWorkbook = myApp.Workbooks.Open( "D:\\Test.xlsx" ); // Cleanup GSIWorkbook.Close( false ); // Manual disposal because of COM while ( System.Runtime.InteropServices.Marshal.ReleaseComObject( GSIWorkbook ) != 0 ) { } myApp.Application.Quit(); myApp.Quit(); while ( System.Runtime.InteropServices.Marshal.ReleaseComObject( myApp ) != 0 ) { } myApp = null; GSIWorkbook = null; GC.Collect(); GC.WaitForPendingFinalizers(); return true; } // End loadExcel 

例2

 private bool loadExcel() { // Open Excel Excel.Application myApp = new Excel.Application(); // Hide Excel myApp.Visible = false; GSIWorkbook = myApp.Workbooks.Open( "D:\\Test.xlsx" ); for ( int counter = 1; counter < 100; counter++ ) { try { GSIWorksheet = GSIWorkbook.Sheets[counter]; if ( GSIWorksheet.Name == _gsi2Sheet ) break; } catch { continue; } } while ( System.Runtime.InteropServices.Marshal.ReleaseComObject( GSIWorksheet ) != 0 ) { } // Cleanup GSIWorkbook.Close( false ); // Manual disposal because of COM while ( System.Runtime.InteropServices.Marshal.ReleaseComObject( GSIWorkbook ) != 0 ) { } myApp.Application.Quit(); myApp.Quit(); while ( System.Runtime.InteropServices.Marshal.ReleaseComObject( myApp ) != 0 ) { } myApp = null; GSIWorkbook = null; GC.Collect(); GC.WaitForPendingFinalizers(); return true; } // End loadExcel 

如果你告诉我们你的excel对象的完整用法,我打赌你会发现你打破了2点法则。 听起来很荒谬我知道,但我认为你是无意中创build不能由Excel或GC处理的对象的实例,然后它不能正常closures。 (称为运行时可调用的包装器)

当你使用 – 说 – 这个代码:

 xlWorkBook = xlApp.Workbooks.Add 

你实际上是在造成这个问题 您需要创build一个指向Workbooks的variables,并直接使用它并处理它。 链接示例:

 Dim xlApp As New Excel.Application Dim xlWorkBooks As Excel.Workbooks = xlApp.Workbooks Dim xlWorkBook As Excel.Workbook = xlWorkBooks.Add() 

那么你所有的代码

 xlApp.Quit() If Not xlWorkBook Is Nothing Then Marshal.FinalReleaseComObject (xlWorkBook) xlWorkBook = Nothing End If If Not xlWorkBooks Is Nothing Then Marshal.FinalReleaseComObject (xlWorkBooks) xlWorkBooks = Nothing End If If Not xlApp Is Nothing Then Marshal.FinalReleaseComObject (xlApp) xlApp = Nothing End If xlApp.Quit() 

详情请看这里:

http://www.siddharthrout.com/2012/08/06/vb-net-two-dot-rule-when-working-with-office-applications-2/