【问题标题】:Random ComException with VB.net Excel AutomationVB.net Excel 自动化的随机 ComException
【发布时间】:2011-06-17 06:56:38
【问题描述】:

我已经对这个问题进行了大量研究,但还没有得出任何确定的结论。我在编写报告时遇到 Excel 随机获取 ComExceptions 的问题。我正在使用 Visual Basic 2005(框架 2.0)控制台应用程序来创建这些报告。这个问题一直很难弄清楚,因为它在写报告时发生在随机的地方,所以我无法捕捉到错误来查看问题。我已经查看了它所破坏的不同项目,并且它们没有什么奇怪的会导致任何这些问题。

此外,有时报告运行良好,没有任何问题。

堆栈跟踪: (15:27:24:247) 类型:System.Runtime.InteropServices.COMException (15:27:24:247) 消息:HRESULT 异常:0x800AC472 (15:27:24:253) 堆栈跟踪:在 System.RuntimeType.ForwardCallToInvokeMemb er(String memberName, BindingFlags flags, Object target, Int32[] aWrapperTypes, 消息数据和消息数据) 在 Microsoft.Office.Interop.Excel.Range.set_Value(对象 RangeValueDataType, 目的 ) 错误代码:-2146777998

【问题讨论】:

  • VBA_E_IGNORE,很不爽。这是一个重入问题,Excel 在内部等待操作完成。在等待时,它无法获取您的请求,但由于它很忙而无法执行它。追溯你的步骤,考虑在它崩溃之前你要求它做什么。

标签: vb.net excel


【解决方案1】:

我的猜测(没有看到您的代码)是您可能会在通过 .NET 互操作使用时释放 COM 对象的方式犯规。请参阅this article 了解快速介绍。

基本上,可能发生的情况是您的代码创建的所有 COM 对象实际上都包装在一个 .NET 对象中。这些 .NET 对象最终会在不可预知的时间被垃圾收集器处理掉。当它们被释放时,底层的 COM 对象被释放。在某些情况下,这可能会导致崩溃,即底层 COM 对象在垃圾回收发生时已被 Excel 销毁。

正是由于这个问题,从 .NET 驱动 Office 比从 VB6 等旧技术驱动 Office 要困难很多倍。 (您可能会遇到的另一个问题是 Excel 进程未终止 - 您会在 SO 上看到很多关于此的问题)。

PS。要开始使用,请在 SO...上搜索 ReleaseComObject...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多