在ref类上实现析构函数时,C ++ / CLI会为您有用地生成IDisposable
脚手架。同样,如果您没有实现析构函数,但是您的类具有实现IDisposable
的成员变量,则IDisposable
会再次在您的类上自动实现。它非常有用,比在C#中处理IDisposable
更好。
在实现保留msclr::com::ptr
(包含RCW的智能指针)的ref类时,我遇到了这种现象。
ref class Test /* : IDisposable added by the compiler */
{
msclr::com::ptr<IWhatever> _aComObject;
}
在我的特定情况下,类引用的COM对象不会“锁定”某些非托管资源,它实际上只是占用了一些CLR无法看到的非托管内存。因此,我希望通过不实现
IDisposable
类来避免混淆我的ref类的用户。相反,我想通过使用GC API添加适当的内存压力来使CLR意识到COM对象的存在。因此,问题是:是否有一种方法可以在没有实现析构函数但包含
IDisposable
成员变量的ref类上禁止实现IDisposable
?注意:通常这样做是错误的做法,因为它将阻止类的用户确定性地处置基础COM对象,但是鉴于特定的情况,暴露
IDisposable
可能会混淆我的ref类的用户,因为确实没有必要处理相关的ref类。我想一个选择是实现不带析构函数的msclr :: com :: ptr的变体。
抑制IDisposable的自动添加的任何其他方法将被理解。谢谢。
回答
声明
_aComObject
作为msclr :: com :: ptr(msclr::com::ptr<IWhatever>^
)的句柄。这样,编译器就不会将Test
视为com ptr对象的“所有者”,并且在删除Test时也不会丢弃它。 最佳答案
我认为答案是握住msclr :: com :: ptr的句柄,而不是“按值”保存它(仍然将其作为“幕后”句柄保存,除了C ++ CLI编译器将其处理)作为值-删除(处置)所有者对象时将其“删除”(称为处置)。