我能阻止C ++ / CLI从IDisposable接口添加到我的引用类?
-
21-08-2019 - |
题
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和你的成员指针分配给它在任何给定的方法,如果你真的需要它。