VB.Net-Excel COM对象未发布

特哈斯

我遇到一个问题,即使调用ReleaseComObject和GC.Collect方法,Excel Process仍保持活动状态。

我的Excel流程终止,但仅在关闭用户表单后终止

下面是示例代码,显示了我为摆脱Excel Process而正在做的所有事情:

Public Class frmTEST
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim objExcel As xl.Application
        Dim wbReport As xl.Workbook = Nothing

        objExcel = CreateObject("Excel.Application")

        Try
            wbReport = objExcel.Workbooks.Open("D:\EL\Nicolas\VS Online\Classe A v2\Launcher-v2.2\Resources\Modules\Zoom.xlsm")
        Catch ex As Exception
            Common.WriteDebugLog("Exception line 44")
        End Try
        If wbReport Is Nothing Then
            MsgBox("Erreur d'ouverture du reporting - Code 745.", vbExclamation)
            Exit Sub
        End If

        With objExcel
            .Visible = False
            .ScreenUpdating = False
            .Calculation = xl.XlCalculation.xlCalculationManual
            .DisplayAlerts = False
        End With

        '' Here I do all my processing which I have removed to make the question more simplified

        With objExcel
            .Calculation = xl.XlCalculation.xlCalculationAutomatic
            .ScreenUpdating = True
            .DisplayAlerts = True
        End With

        ''~~> Close & Clean Up
        wbReport.Close(SaveChanges:=False)
        objExcel.Quit()

        Me.ReleaseObject(wbReport)
        Me.ReleaseObject(objExcel)

        MsgBox("Done")
    End Sub

    Private Sub ReleaseObject(ByVal obj As Object)
        Try
            Dim intRel As Integer = 0
            Do
                intRel = System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
            Loop While intRel > 0
            MsgBox("Final Released obj # " & intRel)
        Catch ex As Exception
            MsgBox("Error releasing object" & ex.ToString)
            obj = Nothing
        Finally
            GC.Collect()
        End Try
    End Sub
End Class

更新:根据收到的评论,我在另一个线程之后对代码进行了更改,但仍然无济于事。我的Excel流程终止,但仅在关闭用户表单后终止

锡锰

如果您使用的是.Net V4或更高版本,请尝试一下。将所有Button1_Click代码移到子例程中,然后从调用它Button1_Click这将使该子例程本地的对象超出范围,从而有资格进行垃圾回收。

然后调用使用Marshal.AreComObjectsAvailableForCleanup函数的清除方法,以确定释放COM对象所需的垃圾回收周期。

评论

如果托管代码和本机代码之间具有大量依赖关系图的引用很多,则清理所有对象可能会花费很长时间。每次运行GC,它将释放一定数量的RCW,从而释放基础的COM对象。然后,这些COM对象将释放其托管引用,并在下次GC运行时使更多对象可用于清理,从而再次开始该过程。

AreComObjectsAvailableForCleanup方法为应用程序提供了一种方法,可以确定需要清理GC.Collect和GC.WaitForPendingFinalizers多少个周期才能清理所有内容。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    ExcelWork()
    Cleanup()
End Sub

Private Sub ExcelWork()
    Dim objExcel As xl.Application
    Dim wbReport As xl.Workbook = Nothing

    objExcel = CreateObject("Excel.Application")

    Try
        wbReport = objExcel.Workbooks.Open("D:\EL\Nicolas\VS Online\Classe A v2\Launcher-v2.2\Resources\Modules\Zoom.xlsm")
    Catch ex As Exception
        Common.WriteDebugLog("Exception line 44")
    End Try
    If wbReport Is Nothing Then
        MsgBox("Erreur d'ouverture du reporting - Code 745.", vbExclamation)
        Exit Sub
    End If

    With objExcel
        .Visible = False
        .ScreenUpdating = False
        .Calculation = xl.XlCalculation.xlCalculationManual
        .DisplayAlerts = False
    End With

    '' Here I do all my processing which I have removed to make the question more simplified

    With objExcel
        .Calculation = xl.XlCalculation.xlCalculationAutomatic
        .ScreenUpdating = True
        .DisplayAlerts = True
    End With

    ''~~> Close & Clean Up
    wbReport.Close(SaveChanges:=False)
    objExcel.Quit()

    MsgBox("Done")
End Sub

Private Sub Cleanup()
    Do
        GC.Collect()
        GC.WaitForPendingFinalizers()
    Loop While Marshal.AreComObjectsAvailableForCleanup
End Sub

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

发布Excel COM对象

来自分类Dev

VB.NET读取后发布Excel文件,因此可以将其覆盖

来自分类Dev

Vb.net导出GridView到Excel

来自分类Dev

在vb.net中使用Excel

来自分类Dev

对象未设置为对象的实例错误Excel 2013 Automation VB.NET

来自分类Dev

VB.NET发布数据在PHP

来自分类Dev

如何使用VB.net在Excel中获得形状

来自分类Dev

在VB.Net中,如何将数组写入Excel

来自分类Dev

VB.Net将日期从Excel拉入数组

来自分类Dev

VB.Net,利用Excel程序集,内存泄漏

来自分类Dev

通过VB .NET编辑Excel连接字符串

来自分类Dev

从excel导入特定数据到datagrid vb.net

来自分类Dev

VB.NET需要对Excel.Application的解释

来自分类Dev

使用VB.NET进行递归Excel操作

来自分类Dev

检查excel实例是否已经存在Vb.net

来自分类Dev

VB.net Excel合并单元格范围

来自分类Dev

VB.net excel每行仅填写一项

来自分类Dev

vb.net数据表转EXCEL

来自分类Dev

以编程方式从 VB.net 命名 Excel 工作簿

来自分类Dev

VB.NET LINQ查询列表(对象)

来自分类Dev

VB.net复制对象(数据视图)

来自分类Dev

VB.net ConnectionStrings对象参考

来自分类Dev

VB.Net移动对象[错误]

来自分类Dev

VB 2010 .NET ComboBox 如何控制对象?

来自分类Dev

JSON - 转换为 VB.NET 对象

来自分类Dev

VB.NET跟踪COM RCW错误

来自分类Dev

VB.NET跟踪COM RCW错误

来自分类Dev

使用Excel过滤器或vb.net过滤Excel行

来自分类Dev

将.NET对象从VB6传递到.NET的问题