Мое приложение содержит 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()
, но это не помогло.
Вы можете попробовать «Marshal.FinalReleaseComObject», хотя мне интересно, есть ли еще какой-нибудь другой скрипт/команда, которая держится за ссылку, кроме переменной, которой вы null. –
Это тоже не помогло. Я не уверен, что может быть задействован другой скрипт/команда - поведение происходит, даже если код PowerShell не вызывает эти объекты (т. Е. Переменные установлены, но никогда не используются). –
Я понял - при хранении переменных создавались временные ссылки: rs.SessionStateProxy.SetVariable («name», obj.subobj). Если я вместо этого сохраняю возвращаемое значение obj.subobj в переменной и освобождаюсь после вызова SetVariable, все работает так, как ожидалось. Благодарю. –