C ++ / CLI时实现上的引用类析构函数有益生成IDisposable脚手架为您服务。另外,如果你不执行析构函数,但你的类有实现IDisposable一个成员变量,然后IDisposable再次自动在你的类中实现。这是非常有益的,比IDisposable如何在C#处理好多了。

我已经实现,其保持引用类时到一个msclr::com::ptr(包含一个RCW智能指针)碰上此行为。

ref class Test /* : IDisposable added by the compiler */
{
  msclr::com::ptr<IWhatever> _aComObject;
}

我的具体情况的,通过我的课引用的COM对象不“锁定”一些非托管资源,它有效地只是使用了一点非托管内存中的CLR无法看到。因此,我想,以避免不执行IDisposable类混淆我引用类的用户。相反,我想通过使用GC API添加适当的内存压力,使CLR知道COM对象的存在。

所以,问题是:有没有办法来抑制执行上没有实现析构一个引用类IDisposable的,但确实持有IDisposable成员变量

注:通常这将是错误的做法,因为这将防止类的用户确定性处置底层的COM对象的,但考虑到具体情况,揭露IDisposable有潜力混淆我引用类的用户,因为它确实是没有必要处置有问题的引用类的。

我想一个选择是将实施msclr :: COM :: PTR的变体没有析构函数。

以抑制自动添加的IDisposable的任何其他方法,将不胜感激。感谢。


答案

声明_aComObject作为手柄到msclr :: COM :: PTR(msclr::com::ptr<IWhatever>^)。编译器不然后把Test为是在COM PTR对象的“所有者”,并且当测试被删除未处置它。

有帮助吗?

解决方案

我想答案是召开的处理应用于msclr :: COM :: PTR而不是“按值”(它仍持有它作为“幕后”的手柄拿着它,除了C ++编译器CLI并将它作为一个值 - “删除”它(调用Dispose)当所有者对象被删除(弃置))

其他提示

我不知道我与ratioanle为避免IDispose实施同意 - 但为什么不只是存储的IWhatever *在你的类。编译器不应该再生成了IDisposable实现。

如果您不希望析构函数的行为又是什么益处是COM :: PTR包装你买?您可以随时在堆栈上声明一个COM :: PTR和你的成员指针分配给它在任何给定的方法,如果你真的需要它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top