ReleaseComObject在静态方法中不起作用

时间:2013-06-11 09:57:01

标签: c# memory-management com interface directshow

在测试我的代码时,我遇到了一个我觉得很奇怪的行为。

此:

if (_sampGrabber != null)
{
    Marshal.ReleaseComObject(_sampGrabber);
    _sampGrabber = null;
}

产生_sampGrabber == null,而

之后
ReleaseIfNotNull(_sampGrabber);
使用

时,

_sampGrabber仍有其原始值

public static int ReleaseIfNotNull(object comObject)
{
    int hr = 0;

    if (comObject != null)
    {
        hr = Marshal.ReleaseComObject(comObject);                
        comObject = null;
    }
    return hr;
}

_sampGrabber是一个DirectShow SampleGrabber过滤器接口。

我对此行为的解释感兴趣。我在使用Visual Studio Test Framework编写测试时遇到过它。

1 个答案:

答案 0 :(得分:4)

如果您需要更改参考,则需要更改签名:

public static int ReleaseIfNotNull(ref object comObject)

comObject内的ReleaseIfNotNull的本地引用更改为仅影响其自身(堆栈)副本,并且不会影响对其的任何其他引用。 ref and out

上的MSDN