【问题标题】:Disposing ActiveX Control on a Form在窗体上处理 ActiveX 控件
【发布时间】:2012-07-31 19:58:42
【问题描述】:

我有一个嵌入到表单中的第三方 ActiveX 控件。控件的类实现 IDisposable。我的问题是我应该在表单关闭事件中手动调用控件的 dispose 方法,还是进入设计器并编辑表单 dispose 方法以调用控件的 dispose。

我知道一个表单调用它拥有的所有控件的 dispose 方法,但是有任何例外,因为这是一个 COM 控件。谢谢。

PS:我使用的是 Visual Studio 2008,.Net 3.5,项目类型:Windows 窗体应用程序

【问题讨论】:

    标签: c# .net vb.net winforms


    【解决方案1】:

    MSDN Marshal.ReleaseComObject 为了释放或释放 COM 对象,您需要使用此代码

    System.Runtime.InteropServices.Marshal.ReleaseComObject( someComObject); 
    

    //这是你的 COM 对象 Dispose 对 COM 对象不起作用 例如调试并尝试使用这样的代码处理您的对象 如果你有一个名为 fs 的对象

    ((IDisposable)fs).Dispose();
    

    【讨论】:

    • 我已经以这种方式释放了我的其他 COM 对象,我提出问题的原因是它是我从 COM 选项卡添加到工具箱项中的 ActiveX 控件。所以我还是有点迷茫。
    【解决方案2】:

    不,你不需要做任何特别的事情。

    因为Control class(其他容器控件,例如Form 继承自)实现了IDisposable interface,它应该(如果它遵循标准IDisposable implementation guidelines)处理它持有的任何实现IDisposable接口。

    也就是说,您的控件,假设它位于由 Controls property 公开的控件集合中,当包含它的窗口关闭时将调用它的 IDisposable.Dispose method(因为关闭窗口会导致窗口的 Dispose 方法被调用)。

    【讨论】:

    • 谢谢。当我在某处阅读经验法则时感到困惑,您应该始终手动调用实现 IDisposable 的类的 dispose。根据您的回答,我可以假设我不必担心实现 IDisposable 并且是表单控件集合的一部分的控件。
    • @user1556110 不,如果您调用Close method on the Form class(或类似地X 窗口外),或处置Control,它是父窗口的所有控件都将被处置正确。
    • 他说它是一个 COM 对象,所以关于释放 COM 对象或 OleAutomation 对象,您的回答不太正确
    • @DJKRAZE 它专门是一个 ActiveX 控件,COM 互操作将正确处理并与窗口生命周期相关联。除非他们正在对非正统的对象做某事,否则会得到适当的处理。
    • 确认后我会回复并接受答案
    猜你喜欢
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多