Освобождение ссылок COM, используемых в PowerShell RunSpace - PullRequest
2 голосов
/ 10 февраля 2011

Мое приложение размещает PowerShell и добавляет ссылки на COM-объекты через RunSpace.SessionStateProxy.SetVariable().После добавления переменных и вызова Invoke для некоторого кода PowerShell COM-объекты не освобождаются должным образом.Как заставить все ссылки COM (включая ссылки на временные ссылки, возвращаемые путем вызова объектной модели COM) быть освобожденными PowerShell и средой выполнения .NET?Я пытался вызвать

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

для всех переменных, а также PipeLine.Dispose(), Runspace.Close() и GC.Collect(), но это не помогло.

1 Ответ

2 голосов
/ 10 февраля 2011

На основании подсказки Кейта я отследил это. При хранении переменных создавались временные ссылки:

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

Если я вместо этого сохраню возвращаемое значение obj.subobj в переменной и ReleaseComObject в локальной переменной после вызова SetVariable, все будет работать как положено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...