7

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 时释放它。

4

2 回答 2

2

我认为答案是持有 msclr::com::ptr 的句柄,而不是“按值”持有它(它仍然将它作为“幕后”的句柄,除了 C++CLI 编译器处理它作为一个值 - 当所有者对象被删除(Disposed)时“删除”它(调用 Dispose))。

于 2009-02-06T15:09:26.777 回答
1

我不确定我是否同意避免 IDispose 实现的理由——但为什么不在你的类中存储一个 IWhatever*。然后编译器不应生成 IDisposable 实现。

如果您不想要析构函数行为,那么 com::ptr 包装器购买您有什么好处?如果你真的需要它,你总是可以在堆栈上声明一个 com::ptr 并在任何给定的方法中将你的成员指针分配给它。

于 2009-02-06T01:32:34.087 回答