【发布时间】:2012-11-16 13:00:08
【问题描述】:
我有一个对 COM 对象使用 .NET 包装器的类,它给了我那个臭名昭著的 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;
}
}
【问题讨论】:
-
什么是“RCW 错误”? RCW 代表 Runtime Callable Wrapper,它只是一个自动生成的包装 COM 对象的 .NET 类。因此,RCW 不是错误,我无法推断出您遇到了什么特定的与 RCW 相关的错误。
标签: c# winforms com idisposable