Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在VB.NET中调用Marshal.FinalRelease后,Excel实例仍然保留_Vb.net_Excel_Excel Interop - Fatal编程技术网

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

在VB.NET中调用Marshal.FinalRelease后,Excel实例仍然保留,vb.net,excel,excel-interop,Vb.net,Excel,Excel Interop,我在这里查看了一些关于在程序运行后删除excel实例的提示,但这些建议似乎都不起作用。当我最初运行它时,它将创建一个excel实例,但当程序仍在运行时,我通过单击按钮重新运行此代码;它将创建另一个excel实例,但这次它将删除它创建的实例,只保留最初运行程序时创建的实例 到目前为止,我对代码的理解是:(从2012年9月14日起更新代码) 提前感谢您的反馈 我的问题与你描述的非常相似。通过使用这个示例代码,它对我有效 ' set all Excel related objects to noth

我在这里查看了一些关于在程序运行后删除excel实例的提示,但这些建议似乎都不起作用。当我最初运行它时,它将创建一个excel实例,但当程序仍在运行时,我通过单击按钮重新运行此代码;它将创建另一个excel实例,但这次它将删除它创建的实例,只保留最初运行程序时创建的实例

到目前为止,我对代码的理解是:(从2012年9月14日起更新代码)


提前感谢您的反馈

我的问题与你描述的非常相似。通过使用这个示例代码,它对我有效

' 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

编辑

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实例分配给一个变量,并显式释放它!但由于它在我的电脑上运行良好,我无法测试它

此外,我还发现了一个描述可能导致您所描述行为的描述

您的Excel加载一个托管加载项(共享加载项或VSTO加载项),该加载项 违反规则。在应用程序自动化Excel之后 应用程序,Excel应用程序无法正确退出,因为 加载的加载项有一些未发布的底层RCW。在这种情况下,, 即使自动化客户端终止,Excel也不会退出。所以 解决此类问题的一个步骤是禁用所有 用于隔离根本原因的加载项。')(有关详细信息,请参阅文章)


请让我知道,如果我的建议之一为你工作

我所做工作的基本概要。在工作簿功能的大图中,我将此逻辑合并到了锁定过程中。我必须关闭Echo,否则最终用户会得到两个实例之间的浮华交互,因为我激活了一个工作簿/工作表,然后移动到另一个工作簿/工作表。这里一定有你可以使用的东西;)

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


否则,您必须在父文件中创建一个集合对象,并在打开新实例时将该应用程序实例存储在集合中,然后定期运行该集合并验证该实例是否处于活动状态。

不管它是否工作!它一直工作到我使用Excel.Range对象为止。一旦使用了它,它就无法摆脱最初创建的excel实例。我用给定的xlsx文件和excel对象库14(Excel2010)检查了您的代码,它很有魅力!您使用的是什么库?我使用的是Microsoft Excel 14.0对象库。另一个问题可能是我使用了一个.xls文件而不是新的excel版本.xlsx。我尝试了这两种格式,但都留下了一个excel实例。您是在visual studio中运行它时尝试过它,还是将其作为发布版本进行了测试?我在调试和发布中编译了它,以clickOnce的形式发布了它,从vs和程序开始—每次都有效!?你用什么图书馆?如果你想给我你的项目或相关的网页弗兰兹。pilgerstorfer@gmx.atSome澄清,
ReleaseObject
是自定义方法吗?同样,如果你只是在读文件,为什么还要打开应用程序呢?您只需打开文件并在中读取文件。这是2007+还是2003-文件?是的ReleaseObj是一种自定义方法。我认为要访问工作簿,必须有一个excel应用程序才能与工作簿交互。这些文件可以是.xls或.xlsx文件类型。这取决于您是从Excel文档中获取数据,还是在玩“子”文档并从中提取数据?因为如果您基本上将其作为结构化平面文件(即csv)使用,则只需创建文件的数据连接器,即可更快地访问这些文件,并且不会将加载时间与新的isntance关联。如果您正在复制Table/NamedRange,那么您可以像我以前为客户的一个项目所做的那样。
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