在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编译器将其处理)作为值-删除(处置)所有者对象时将其“删除”(称为处置)。

07-24 19:26
查看更多