VB.Net - Excel COM 对象未释放[重复]

2023-11-25

我面临的问题是,即使在调用 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

UPDATE:根据我收到的评论,我对代码进行了更改 遵循其他线程,但仍然没有帮助。我的Excel 进程终止,但仅在我关闭用户表单后


如果您使用 .Net V4 或更高版本,请尝试一下。 移动你所有的Button1_Click将代码写入子程序并从中调用Button1_Click。这将允许该子例程本地的对象超出范围,从而有资格进行垃圾收集。

然后调用一个清理方法,该方法使用Marshal.AreComObjectsAvailableForCleanup函数来确定需要多少个垃圾收集周期来释放 COM 对象。

Remarks

如果托管代码和本机代码之间存在大量具有深度依赖关系图的引用,则可能需要很长时间才能清理所有对象。每次 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VB.Net - Excel COM 对象未释放[重复] 的相关文章

  • System.Drawing.Image.Save 抛出ExternalException:GDI 中发生一般错误

    我有一个函数 它需要一个位图 复制它的一部分并将其保存为 8bpp tiff 结果图像的文件名是唯一的并且文件不存在 程序有权写入目标文件夹 void CropImage Bitmap map Bitmap croped new Bitma
  • IL 的仿制药?

    是否可以在 IL 生成器中使用泛型 DynamicMethod method new DynamicMethod GetStuff typeof int new Type typeof object ILGenerator il metho
  • 正则表达式不等于字符串

    我用正则表达式用头撞墙 我正在尝试定义一个表达式 该表达式完全排除此文本 System 不区分大小写 但可以包含 系统 这个词提供的不仅仅是这个 例子 系统 无效 系统 无效 系统 无效 系统 无效 asd 系统 有效 asd 系统 asd
  • Pythoncom - 将相同的 COM 对象传递给多个线程

    你好 对于 COM 对象 我是一个完全的初学者 非常感谢任何帮助 我正在开发一个Python程序 该程序应该以客户端 服务器的方式读取传入的MS Word文档 即客户端发送一个请求 一个或多个MS Word文档 服务器使用pythoncom
  • 导出到excel时如何显示前导零?

    我正在通过更改内容类型来创建 Excel 报告 Response ContentType application vnd ms excel 我有包含前导零的值 问题是导出到 Excel 时缺少前导零 e g 000123 gt 123 我知
  • 如何在 Excel 中对一组数据进行排序以匹配另一组数据?

    我有一个不按字母或数字顺序排列的数据列表 我想对同一日期的第二个列表进行排序以匹配第一个列表 我无法更改数据的顺序 我的目标是将第二组中的附加数据粘贴回第一个数据集中 DATA SET A DATA SET B 22350 BH160 10
  • 托管 .NET 代码中的“访问冲突写入位置...”

    我收到以下异常 MqSearch exe 中 0x000007FE21AFE593 mscorlib ni dll 处出现未处理的异常 0xC0000005 写入位置 0x00000006609476FD 时出现访问冲突 代码是完全托管的
  • SQL Server,插入 Excel“链接服务器”时出现“无效列名”错误

    我有一个简单的 Excel 电子表格文档 运行 Office 2013 我使用 Microsoft Office 15 0 Access 数据库引擎 OLE DB 提供程序 将其用作数据库 我可以使用 MS SQL Server Manag
  • 调整图像的亮度、对比度和伽玛值

    在 NET 中调整图像的亮度 对比度和伽玛值的简单方法是什么 c and gdi have a simple way to control the colors that are drawn It s basically a ColorMa
  • 我可以获取VBA代码中的注释文本吗

    可以说我有以下内容 Public Sub Information TEST End Sub 有没有办法得到 TEST 结果 不知何故通过VBA 例如 在 PHP 中 有一个获取注释的好方法 这里有什么想法吗 编辑 应该有办法 因为像 MZ
  • c#.NET 和 sprintf 语法

    这段代码如何翻译成 C 具体来说是如何sprintf用C 实现 string output The user s logged in string loggedIn is string loggedOut isn t if TheUser
  • 如何等到 Excel 计算公式后再继续 win32com

    我有一个 win32com Python 脚本 它将多个 Excel 文件合并到电子表格中并将其另存为 PDF 现在的工作原理是输出几乎都是 NAME 因为文件是在计算 Excel 文件内容之前输出的 这可能需要一分钟 如何强制工作簿计算值
  • .NET“默认行终止符”?

    有什么方法可以弄清楚 NET 使用什么作为其 默认行终止符 例如 StringBuilder AppendLine String 的文档表示 附加指定字符串的副本 后跟默认行终止符 NET 中的几个与文本相关的类引用相同的概念 有什么方法可
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • Excel 数字缩写格式

    这是我想要完成的任务 Value Display 1 1 11 11 111 111 1111 1 11k 11111 11 11k 111111 111 11k 1111111 1 11M 11111111 11 11M 11111111
  • 使用输入作为显示日期的基础

    我需要一种方法来使用用户窗体上的输入来确定将在输出上显示的日期 这是我的代码 If StatusBox Value lt 23 59 And ShiftCode Value AP Then Cells emptyRow 8 Value Da
  • VB.NET 中的静态方法实现

    我很困惑Static在 VB NET 中的实现 在 C 中 我们可以创建静态类和静态方法来为我们的应用程序编写实用方法 现在 VB NET 让我们创建Module代替静态类 如果我们在模块中创建一个方法 默认情况下它会变成静态的 但在我的应
  • 引用的程序集自动由 Visual Studio 替换

    我有 2 个项目 一个可移植类库和一个常规单元测试项目 在可移植类库中 我使用 NuGet 来引用 Microsoft BCL 可移植包 它附带 2 个程序集 System Threading Tasks dll and System Ru
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 在VBA中初始化全局变量

    在 Excel 2003 中 如何声明全局变量并仅在打开工作簿时初始化它们一次 我有一些由几个宏使用的参数 基本上是输入文件的路径 目前 我的代码如下所示 global path1 path2 as string sub initPaths

随机推荐

  • 处理取消令牌源的正确模式

    考虑这样一个场景 您需要完成一些异步工作 并且可以在即发即忘模式下运行它 此异步工作能够侦听取消 因此您可以向其传递取消令牌以便能够取消它 在给定时刻 我们可以决定通过使用从中获取取消令牌的取消令牌源对象来请求取消正在进行的活动 因为取消令
  • 所有子类的 C++ 模板专门化

    我需要创建一个像这样的模板函数 template
  • 如何在 Rails 中发现模型属性?

    我发现很难轻松地查看所有模型类中存在哪些属性 属性 因为它们没有在我的类文件中明确定义 为了发现模型属性 我保持 schema rb 文件打开 并在它和我根据需要编写的任何代码之间切换 这可以工作 但很笨重 因为我必须在读取架构文件以获取属
  • Google 地图 api-3:更改多边形的默认光标

    例如 我可以更改地图的draggableCursor 但即使我更改它 多边形的光标仍然是指针 因为地图位于多边形后面 我想将多边形的光标设置为 移动 以便明确多边形是可拖动的 更改多边形光标的正确方法是什么 有一个属性或方法可以做到这一点吗
  • 在 ASP.NET Core 中使用防伪 cookie,但使用非默认 CookieName

    我正在考虑更改 ASP NET Core 中默认防伪 cookie 的名称 我想更改 cookie 名称的原因是为了使 cookie 匿名化 在我看来 最终用户没有理由能够确定此 cookie 的责任 Microsoft AspNetCor
  • 如何使用 JSF2 处理多态性?

    我需要显示 编辑多态实体 我的抽象类是Person 我的具体课程是自然人 and 有道德的人 每个具体类都有自己的自定义属性 如何根据实体类使用适当的显示 编辑 复合 组件 谢谢 不存在这样的事情instanceof在EL 但是 您可以 a
  • NHibernate 通过代码映射 (Loquacious) - 级联选项

    我对使用 NHibernate 按代码映射时的级联枚举选项行为有疑问 枚举有以下选项 Flags public enum Cascade None 0 Persist 2 Refresh 4 Merge 8 Remove 16 Detach
  • 如何根据类别计数过滤数据框

    如何对数据帧进行子集化 以便仅包含包含其值在其他行中显示一定次数的列的行 例如 如果我有一个标记为 食物 的列 我将如何过滤掉在整个数据框中出现少于 5 次的食物的所有行 这是一个简单的例子 dat lt data frame x runi
  • v8 |手动启动垃圾收集器

    有没有办法在 Google V8 引擎上手动启动垃圾收集器 我找不到任何参考 通常GC都支持这个功能 你可以暴露v8 HEAP gt CollectAllGarbage函数到 通过命令标志的全局 JavaScript 命名空间 expose
  • Linux 系统的 OPEN_MAX 在哪里定义?

    OPEN MAX是定义单个程序允许的最大打开文件数的常量 According to Beginning Linux Programming 4th Edition Page 101 该限制通常由 limit h 中的常量 OPEN MAX
  • Laravel RoleMiddleware,未找到类角色

    我正在尝试添加一个简单的中间件来检查用户是否与角色匹配 当我使用中间件时遇到问题 出现异常 ReflectionException 类角色不存在 我不会尝试调用名为 role 的类 因此我认为这在 Laravel 的某个地方神奇地发生了 我
  • 我的 javascript webApp 首先读取一个短的 mp3 文件并在其中找到静音间隙 用于导航目的 然后播放相同的 mp3 文件 提示它从一个静音或另一个静音结束的位置开始 这与通常的 webAudio 场景不同 通常的 webAu
  • 无法在 PHP 中连接 2 个数组

    我最近学习了如何在 PHP 中使用 运算符连接 2 个数组 但考虑一下这段代码 array array Item 1 array array Item 2 var dump array 输出是 数组 1 0 gt 字符串 6 项目 1 为什
  • 单击时如何不突出显示 NSButton 的模板图像?

    我在 NSTableView 的每一行都有 NSButtons 按钮图像在 IB 中设置 并且带 Alpha 通道的黑色图标 窗口设置为暗模式 window appearance NSAppearance named NSAppearanc
  • 如何在 Twitter Rest API v1.1 中从 FHSTwitterEngine 完全注销?

    FHSTwitterEngine engine FHSTwitterEngine sharedEngine engine clearAccessToken 我尝试了上面的代码 但是当我尝试再次登录时 文本字段不会出现在presentModa
  • 是否有 Perl 模块或技术可以更轻松地使用长命名空间?

    有些命名空间又长又烦人 假设我下载了名为 FooFoo BarBar BazBaz tar gz 的假设包 它具有以下模块 FooFoo BarBar BazBaz Bill FooFoo BarBar BazBaz Bob FooFoo
  • 为什么即使不调用公共复制构造函数也需要它?

    拥有一个公共复制构造函数将使小程序 编译 但不显示副作用 复制 include
  • 水平线上的三角形指针/边框

    我正在尝试在水平线上创建三角形指针 边框 这是我想要实现的目标的示例 我尝试操纵 div 的顶部边框 但到目前为止我所做的一切根本不起作用 有多种方法可以实现这一点 这可能取决于您的布局 一种解决方案是使用两侧带有边框的旋转元素 trian
  • PublicKeyCredential 无法序列化

    我正在 Angular 应用程序中实现 FIDO2 WebAuthn 我已经获得了 PublicKeyCredentialCreationOptions 对象和 seccessfullt 寄存器 但打电话后 let response awa
  • VB.Net - Excel COM 对象未释放[重复]

    这个问题在这里已经有答案了 我面临的问题是 即使在调用 ReleaseComObject 和 GC Collect 方法后 Excel Process 仍保持活动状态 我的 Excel 进程终止 但仅在我关闭用户表单后才终止 下面是示例代码