2

コードをテストしているときに、奇妙な動作に遭遇しました。

これ:

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 を使用してテストを作成しているときに、これに遭遇しました。

4

1 に答える 1

4

参照を変更する必要がある場合は、署名を次のように変更する必要があります。

public static int ReleaseIfNotNull(ref object comObject)

comObject内部へのローカル参照を変更すると、ReleaseIfNotNullそれ自体の (スタック) コピーにのみ影響し、それに対する他の参照には影響しません。MSDN オンrefout

于 2013-06-11T09:59:10.870 に答える