我是否需要在每个’foreach’迭代中释放COM对象?

这是(潜在的)问题:

我创建一个COM对象,然后使用’foreach’迭代它返回的集合中的每个元素。 我是否需要释放我在集合中迭代的每个元素? (参见下面的代码。)如果是这样,我想不出有效地从’finally’语句中释放它的方法,以防万一在项目被操作时出现错误。

有什么建议?

private static void doStuff() { ComObjectClass manager = null; try { manager = new ComObjectClass(); foreach (ComObject item in manager.GetCollectionOfItems()) { Log.Debug(item.Name); releaseComObject(item); // <-- Do I need this line? // It isn't in a 'finally' block... // ...Possible memory leak? } } catch (Exception) { } finally { releaseComObject(manager); } } private static void releaseComObject(object instance) { if (instance != null) { try { System.Runtime.InteropServices.Marshal.ReleaseComObject(instance); } catch { /* log potential memory leak */ Log.Debug("Potential memory leak: Unable to release COM object."); } finally { instance = null; } } } 

您不应该使用带有COM对象的foreach语句,因为在您无法控制释放的场景后面进行引用。 我会切换到for循环,并确保你永远不会使用COM对象的两个点。

这看起来的方式是:

 try { manager = new ComObjectClass(); ComObject comObject = null; ComObject[] collectionOfComItems = manager.GetCollectionOfItems(); try { for(int i = 0; i < collectionOfComItems.Count; i++) { comObject = collectionOfComItems[i]; ReleaseComObject(comObject); } } finally { ReleaseComObject(comObject); } } finally { ReleaseComObject(manager); }