Рассмотрите следующий код C#, используя COM-объект.Освобождение временных объектов COM
MyComObject o = new MyComObject;
try
{
var baz = o.Foo.Bar.Baz;
try
{
// do something with baz
}
finally
{
Marshal.ReleaseComObject(baz);
}
}
finally
{
Marshal.ReleaseComObject(o);
}
Это выпустит COM объекты o
и baz
, но не временные объекты returnd по o.Foo
и o.Foo.Bar
. Это может вызвать проблемы, когда эти объекты содержат большое количество неуправляемой памяти или других ресурсов.
Очевидным, но уродливым решением было бы, еще больше загромождать код try-finally
и Marshal.ReleaseComObject
. См C# + COM Interop, deterministic release
В качестве обходного пути, я создал вспомогательный класс
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);
}
}
Использование:
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
}
Мои вопросы: Существуют ли потенциальные проблемы с этим кодом? У кого-нибудь более элегантное решение?
(добавлен пример с использованием дерева подход выражение) –
@downvoter: пожалуйста, оставьте комментарий – Henrik