2011-02-10 3 views
2

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

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

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

+1

Вы можете попробовать «Marshal.FinalReleaseComObject», хотя мне интересно, есть ли еще какой-нибудь другой скрипт/команда, которая держится за ссылку, кроме переменной, которой вы null. –

+0

Это тоже не помогло. Я не уверен, что может быть задействован другой скрипт/команда - поведение происходит, даже если код PowerShell не вызывает эти объекты (т. Е. Переменные установлены, но никогда не используются). –

+0

Я понял - при хранении переменных создавались временные ссылки: rs.SessionStateProxy.SetVariable («name», obj.subobj). Если я вместо этого сохраняю возвращаемое значение obj.subobj в переменной и освобождаюсь после вызова SetVariable, все работает так, как ожидалось. Благодарю. –

ответ

2

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

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

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

Смежные вопросы