c# - 我是否需要在每次 'foreach' 迭代时释放 COM 对象?

标签 c# com memory-management memory-leaks com-interop

这是(潜在的)问题:

我创建了一个 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 循环并确保你 never use two dots with COM objects.

这看起来会是这样的:

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);
}

关于c# - 我是否需要在每次 'foreach' 迭代时释放 COM 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4317850/

相关文章:

c# - NAudio频带强度

暴露给 VBA (COM) 的 C# 属性 : Run-time error '424' : Object required

windows - 我应该为 RTSP 客户端创建一个新线程还是只使用媒体基础中的自定义 IMFMediaSource

powershell - 通过Powershell计算Word文档中的页数,无需com对象

c# - 用字符串路径绑定(bind)背景

c# - 如何重命名 servicestack 中的默认 session cookie 名称

c# - 如何用一种颜色绘制一个基本字形,并用另一种颜色绘制其附加的变音符号?

Java使用HashMap进行内存管理

iphone - iphone:使用dispatch_async进行内存管理

apache - 如何测量每个事件 Apache 连接的内存使用情况?