C#自定义窗体在退出时引发COMException

3

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

此自定义表单是通过我在附加到“Ribbon”的 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) 以确保安全。 - Hans Passant
1个回答

0

我猜测一下,COMException 的 HResult 意味着 需要对象,所以当你调用 CommandBarButton.Delete 时,可能有两种情况出现。

要么你已经处理了该按钮实例,要么你应该在 Delete 调用中传递 truefalse

在将按钮从工具栏中移除之前,不应该处理该按钮,而且当它被处理时,你可能需要使用 Marshal.ReleaeComObject 来正确取消引用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接