在VB.NET中调用Marshal.FinalRelease后,Excel的实例仍然存在

我在这里看了一些关于在我的程序运行后摆脱一个Excel实例的提示,但没有任何build议似乎工作。 当我最初运行它将创build一个Excel的实例,但程序仍在运行,我通过单击button重新运行此代码; 它会创build另一个excel实例,但是这一次它删除了它创build的实例,只留下程序第一次运行时创build的实例。

到目前为止,我的代码是这样的:( 更新代码截至2012年9月14日)

Private Sub GetBatchFileContents() Dim xlApp As Excel.Application Dim xlWB As Excel.Workbook Dim xlWS As Excel.Worksheet Dim xlRan As Excel.Range Dim xlVal(,) As Object Dim lastRow As Int32 xlApp = New Excel.Application() xlWB = xlApp.Workbooks.Open(TextBox1.Text.ToString(), _ Type.Missing, _ Type.Missing, _ Type.Missing, _ Type.Missing, _ Type.Missing, _ Type.Missing, _ Type.Missing, _ Type.Missing, _ Type.Missing, _ Type.Missing, _ Type.Missing, _ Type.Missing, _ Type.Missing, _ Type.Missing) xlWS = xlWB.Worksheets.Item(1) lastRow = xlWS.Cells(xlWS.Rows.Count, 1).End(Excel.XlDirection.xlUp).Row xlRan = xlWS.Range(xlWS.Cells(1, 1), xlWS.Cells(lastRow, 130)) xlVal = xlRan.Value2() ReleaseObj(xlRan) ReleaseObj(xlWS) xlWB.Close(False, Type.Missing, Type.Missing) ReleaseObj(xlWB) xlApp.Quit() ReleaseObj(xlApp) End Sub Private Sub ReleaseObj(ByRef obj As Object) Try Marshal.FinalReleaseComObject(obj) Catch ex As Exception Stop Finally obj = Nothing End Try GC.Collect() GC.WaitForPendingFinalizers() GC.Collect() End Sub 

在此先感谢您的反馈!

我有一个非常类似的问题,你所描述的。 通过使用这个示例代码,它为我工作

 ' set all Excel related objects to nothing columnHeaders = Nothing range = Nothing endCell = Nothing startCell = Nothing excelSheet = Nothing excelSheets = Nothing excelWorkbook.Close() excelWorkbook = Nothing excelApp.Quit() ' release com ressources Marshal.FinalReleaseComObject(excelApp) ' ! excelApp = Nothing GC.Collect() GC.WaitForPendingFinalizers() 

请参阅MSDN上的FinalReleaseComObjectReleaseComObject

编辑

 Private Sub GetBatchFileContents() Dim xlApp As Excel.Application Dim xlWB As Excel.Workbook Dim xlWS As Excel.Worksheet Dim xlRan As Excel.Range Dim xlVal(,) As Object Dim lastRow As Int32 xlApp = New Excel.Application() xlWB = xlApp.Workbooks.Open(TextBox1.Text.ToString(), _ Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, _ Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, _ Type.Missing, Type.Missing, Type.Missing, Type.Missing) xlWS = xlWB.Worksheets.Item(1) ' original 'lastRow = xlWS.Cells(xlWS.Rows.Count, 1).End(Excel.XlDirection.xlUp).Row ' new Dim range1 As Excel.Range range1 = xlWS.Cells(xlWS.Rows.Count, 1) Dim range2 As Excel.Range range2 = range1.End(Excel.XlDirection.xlUp) lastRow = range2.Row ReleaseObj(range1) ReleaseObj(range2) ' original 'xlRan = xlWS.Range(xlWS.Cells(1, 1), xlWS.Cells(lastRow, 130)) ' new Dim range1_1 As Excel.Range range1_1 = xlWS.Cells(1, 1) Dim rangeLastRow_130 As Excel.Range rangeLastRow_130 = xlWS.Cells(lastRow, 130) xlRan = xlWS.Range(range1_1, rangeLastRow_130) ReleaseObj(range1_1) ReleaseObj(rangeLastRow_130) ' unchanged xlVal = xlRan.Value2() ReleaseObj(xlRan) ReleaseObj(xlWS) xlWB.Close(False, Type.Missing, Type.Missing) ReleaseObj(xlWB) xlApp.Quit() ReleaseObj(xlApp) End Sub 

我改变了你的代码,把每个可能的COM实例都分配给一个variables,明确地释放它! 但是,因为它在我的电脑上工作正常,我无法testing它。

此外,我find一篇文章描述可能会导致你描述的行为。

您的Excel加载托pipeAddIn(共享AddIn或VSTO AddIn) ,这打破了规则。 应用程序自动化Excel应用程序后,Excel应用程序无法正确退出,因为加载的AddIn有一些底层的RCW没有发布。 在这种情况下,即使您的自动化客户端终止,Excel也不会退出。 因此,解决这类问题的一个步骤就是禁用所有的AddIns来隔离根本原因。“(详见文章)

请让我知道,如果我的一个propossals适合你!

我所做的基本概要。 我在Workbooksfunction的大图中将此逻辑并入了locking进程。 我不得不closures回声,否则最终用户得到了两个实例之间华丽的交互,因为我激活一个工作簿/工作表,然后移动到其他工作簿/工作表。 这里肯定有东西可以用在这里;)。

这是我在我的项目中使用的所有srcwb.Close SaveChanges:=False ,它closures了文件。 我过去所做的是获得一个对象引用的Application所以我可以得到实例的系统ID,并从应用程序closures它。 这当然假设你有代码隐藏的VBA /项目控制,而不仅仅是一个平面数据文件。

否则,您将不得不在父文件中创build一个集合对象,并在集合中打开一个新的实例存储该应用程序实例,然后定期运行集合并validation该实例是否存在。