Considere el siguiente código C# utilizando un objeto COM.Liberación de objetos COM temporales
MyComObject o = new MyComObject;
try
{
var baz = o.Foo.Bar.Baz;
try
{
// do something with baz
}
finally
{
Marshal.ReleaseComObject(baz);
}
}
finally
{
Marshal.ReleaseComObject(o);
}
Esto liberará los objetos de COM o
y baz
, pero no los objetos temporales returnd por o.Foo
y o.Foo.Bar
. Esto puede causar problemas cuando esos objetos contienen una gran cantidad de memoria no administrada u otros recursos.
Una solución obvia pero fea sería desordenar el código aún más con try-finally
y Marshal.ReleaseComObject
. Ver C# + COM Interop, deterministic release
Como solución, he creado una clase de ayuda
class TemporaryComObjects: IDisposable
{
public C T<C>(C comObject)
{
m_objects.Add(comObject);
return comObject;
}
public void Dispose()
{
foreach (object o in m_objects)
Marshal.ReleaseComObject(o);
}
}
Uso:
using (TemporaryComObjects t = new TemporaryComObjects())
{
MyComObject o = t.T(new MyComObject);
var baz = t.T(t.T(t.T(o.Foo).Bar).Baz);
// do something with baz
}
Mis preguntas: ¿Existen problemas potenciales con este código? ¿Alguien tiene una solución más elegante?
(añade un ejemplo usando el método del árbol de expresión) –
@downvoter: por favor deje un comentario – Henrik