【问题标题】:C# Custom Form throwing COMException on exitC# 自定义表单在退出时抛出 COMException
【发布时间】:2012-08-23 03:14:03
【问题描述】:

我创建了一个自定义表单,其中包含几个按钮和一个文本框。

此自定义表单由我在 Microsoft Outlook 加载项上创建的单击事件按钮打开,我正在处理该加载项附加到“功能区”。 (不确定这是否重要,这里没问题)。

在 windows 窗体上,第一个按钮只是将文本文件的内容保存到磁盘。

另一个按钮尝试关闭表单。在此按钮单击事件中,我尝试了以下两行,分开和一起

this.Close();和 this.Dispose();

当我使用此按钮或窗体退出(位于 windows 窗体右上角的“x”)时,我收到以下错误,

COMException 未被用户处理 HRESULT 异常:0x800A01A8

当抛出此错误时,它会将我带到以下方法的“Connect.cs”文件,

public void OnBeginShutdown(ref System.Array custom)
        {

            this.toolbarButton.Delete(System.Reflection.Missing.Value);
            this.toolbarButton = null;

        }

我不确定如何开始解决此问题。我做了相当多的研究,但不幸的是没有找到太多。我确信问题可能在于我创建了一个没有经验的自定义表单,并且有一些我没有做过或不知道的“内务管理”或“最佳实践”。

有人对此有见解吗?

【问题讨论】:

  • 这段代码在运行两次时会爆炸。并非完全不可能,因为 Form.Close() 通常已经包含了一个 dispose。为了安全起见,添加if (this.toolbarButton != null)

标签: c# exception error-handling ms-office add-in


【解决方案1】:

我在这里猜测了一下,但 COMException 的 HResult 表示 Object Required, 所以,当你打电话给CommandBarButton.Delete 时,两件事之一是错误的。

要么你已经释放了按钮实例,要么你应该将truefalse 传递给Delete 调用。

在从工具栏中删除按钮之前,不应释放该按钮,当它被释放时,您可能需要执行Marshal.ReleaeComObject 以正确取消引用它。

【讨论】:

    猜你喜欢
    • 2018-07-02
    • 2014-11-06
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    相关资源
    最近更新 更多