考虑下面使用 COM 对象的 C# 代码。
一个明显但不太好的解决方案是,在代码中添加更多的 `try-finally` 和 `Marshal.ReleaseComObject`。请参见 C# + COM Interop, deterministic release。
为了解决这个问题,我创建了一个帮助类
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, 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
}
我的问题:
这段代码存在潜在的问题吗?
有人有更优雅的解决方案吗?