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对象的基本理解,我做错了什么?