在foreach循环之后处理IDisisable COM对象包装的正确方法

San*_*ord -3 c# com foreach idisposable rcw

foreach循环调用自动.dispose()实现的对象IDisposable.这是一个很好的功能,但是假设你有以下功能:

public COMWrapper GetCOMWrapperByName(string COMWrapperName)
{
    List<COMWrapper> COMWrapperList = GetCOMWrappersFromPlace();

    foreach(COMWrapper cw in COMWrapperList)
    {
        if(cw.name == COMWrapperName)
            return cs;
    }
}
Run Code Online (Sandbox Code Playgroud)

COMWrapper.dispose()方法发布它相关的COM对象.

据我所知,foreach循环将COMWrapper在循环结束时处理每个循环,但随后离开匹配,COMWrapper因为它在到达语句结束之前返回.

然而,对于列表中COMWrapper留下的引用,这成为一个问题,COMWrapperList因为它们中的一半已经删除了它们的底层COM对象RCW包装器而没有被丢弃.更糟糕的是,列表的剩余部分有完全不受管理的COM对象现在漂浮在以太网中,并且由于COMWrapper它们存在的对象尚未被处理掉,因此在一个声明中进行适当的遍历List和调用变得非常困难(我们不是毕竟,想要释放COM对象两次)..dispose()finally

是否可以确定是否已释放COM对象而不捕获ObjectDisposedException异常?是否有更好的方法来处理剩余的COM对象及其包装器?或者我可能完全误解了这种情况,需要重新评估我对COM对象的基本理解,我做错了什么?

Ser*_*rvy 5

foreach不会处理正在迭代的序列中的所有对象.它只处置的IEnumerator对象,为您提供的对象上迭代.