2011-02-10 16 views
2

私のアプリケーションはPowerShellをホストし、RunSpace.SessionStateProxy.SetVariable()経由でCOMオブジェクト参照を追加します。いくつかのPowerShellコードで変数を追加してInvokeを呼び出した後、COMオブジェクトは適切に解放されません。 PowerShellと.NETランタイムによって、COMオブジェクトモデルの呼び出しによって返された一時参照を含むすべてのCOM参照を強制的に解放するにはどうすればよいですか?私もPipeLine.Dispose()Runspace.Close()、およびGC.Collect()、すべての変数に PowerShell RunSpaceで使用されるCOM参照を解放する

object o = rs.SessionStateProxy.GetVariable(name); 
    if (o != null) 
    { 
     rs.SessionStateProxy.SetVariable(name, null); 
     Marshal.ReleaseComObject(o); 
    } 

を呼び出してみましたが、それは助けにはなりませんでした。

+1

'Marshal.FinalReleaseComObject'を試してみることもできますが、null以外の参照に加えて他のスクリプト/コマンドがあると思います。 –

+0

それも役に立たなかった。 PowerShellコードがこれらのオブジェクトを呼び出さなくても(つまり、変数は設定されていますが使用されていなくても)動作します。 –

+0

私はそれを理解しました - 変数を格納するとき、一時参照が作成されていました:rs.SessionStateProxy.SetVariable( "name"、obj.subobj)。代わりにobj.subobjの戻り値を変数に格納し、SetVariableを呼び出した後に解放すれば、すべてが期待通りに機能します。ありがとう。 –

答えて

2

キースのヒントに基づいて、私はこれを追跡しました。変数を格納すると、一時的な参照が作成されたばかり:

RunSpace.SessionStateProxy.SetVariable("name", obj.subobj) 

私が代わりにSetVariableを呼び出した後、戻り変数でobj.subobjの値とローカル変数にReleaseComObjectを保存する場合、すべてが期待通りに動作します。

関連する問題