c# - 为具有 COM 对象的类编写正确的 IDisposable 实现

标签 c# winforms com idisposable

我有一个使用 .NET 包装器作为 COM 对象的类,它给了我那个臭名昭著的 RCW 错误,所以在我的调查中我发现,如果我从这个类的终结器中取出 Dispose() 方法它将修复 RCW 错误,因此出现问题,例如对象正在被处置,但注册的事件仍然存在......但仅仅删除 Dispose() 不能解决问题,因为谁将释放内存? (我运行了内存分析器并确认仅删除 Dispose 方法会导致 20MB 的额外非托管内存)

所以我使用 Dispose 模型的方式应该有问题..这是我所拥有的:

  private MyCOMobject theCOMobject = null;

    static SuppressFieldCntrlr()
    {
        new SomeCalss();
    }

    ~SuppressFieldCntrlr()
    {
       Dispose(false); 
    }



    private bool disposed = false;

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    private void Dispose(bool disposing)
    {
        if (!this.disposed)
        {
            if (disposing)
            {
                theCOMobject.Dispose();
            }

            MethodFoo(false);

            disposed = true;
        }
    }

最佳答案

对于 COM 对象,您需要调用 Marshal.ReleaseComObject。 Marshal 类位于命名空间 System.Runtime.InteropServices 中。

更多信息here .

关于c# - 为具有 COM 对象的类编写正确的 IDisposable 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13609098/

相关文章:

.net - COM 包装的 .Net dll 配置文件

c# - 使用 ERPConnect (Theobald) 运行用户比较

c# - WMI 获取所有监视器不返回所有监视器

C#/winforms : ItemCheckEventHandler after new checkstate has been applied

MySQL EF6 'System.Data.EntityClient' 未在机器中注册

python - 使用 win32inet.WinHttpGetProxyForUrl 的正确方法是什么

c# - WPF 复选框样式更改

c# - 远程MySQL连接: 'Host does not support SSL connections'

c# - 系统.ComponentModel.Win32Exception : The operation completed successfully

string - BSTR 和字符串