Рассмотрим следующий код C # с использованием 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
, но не временные объекты, возвращающиеся на o.Foo
и o.Foo.Bar
.
Это может вызвать проблемы, когда эти объекты содержат большой объем неуправляемой памяти или других ресурсов.
Очевидным, но уродливым решением было бы еще больше загромождать код с помощью try-finally
и Marshal.ReleaseComObject
. Увидеть
C # + COM Interop, детерминированный выпуск
В качестве обходного пути я создал вспомогательный класс
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
}
Мои вопросы:
Есть ли потенциальные проблемы с этим кодом?
У кого-нибудь есть более элегантное решение?