IDisposable
当您在 ref 类上实现析构函数时,C++/CLI 会为您生成脚手架。此外,如果您没有实现析构函数,但您的类有一个成员变量 implements IDisposable
,那么IDisposable
它会再次在您的类上自动实现。IDisposable
它非常有用,并且比C# 中的处理方式要好得多。
在实现一个持有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
在不实现析构函数但持有IDisposable
成员变量的 ref 类上的实现?
注意:这通常是错误的做法,因为它会阻止该类的用户确定性地处理底层 COM 对象,但考虑到特定情况,暴露IDisposable
可能会混淆我的 ref 类的用户,因为它确实不需要 Dispose 有问题的 ref 类。
我想一种选择是在没有析构函数的情况下实现 msclr::com::ptr 的变体。
任何其他抑制自动添加 IDisposable 的方法将不胜感激。谢谢。
回答
声明_aComObject
为 msclr::com::ptr ( msclr::com::ptr<IWhatever>^
) 的句柄。编译器不会将其Test
视为 comptr 对象的“所有者”,并且不会在删除 Test 时释放它。