Betrachten Sie den folgenden C# -Code mit einem COM-Objekt.Temporäre COM-Objekte freigeben
MyComObject o = new MyComObject;
try
{
var baz = o.Foo.Bar.Baz;
try
{
// do something with baz
}
finally
{
Marshal.ReleaseComObject(baz);
}
}
finally
{
Marshal.ReleaseComObject(o);
}
Dies wird lösen die COM-Objekte o
und baz
, aber nicht die temporären Objekte returnd von o.Foo
und o.Foo.Bar
. Dies kann zu Problemen führen, wenn diese Objekte eine große Menge an nicht verwaltetem Speicher oder anderen Ressourcen enthalten.
Eine naheliegende, aber hässliche Lösung wäre, den Code mit try-finally
und Marshal.ReleaseComObject
noch mehr zu verstopfen. Siehe C# + COM Interop, deterministic release
Als Abhilfe können, habe ich eine Hilfsklasse
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);
}
}
Verbrauch:
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
}
Meine Fragen: Gibt es mögliche Probleme mit diesem Code? Hat jemand eine elegantere Lösung?
(hinzugefügt, um den Ausdrucksbaum Ansatz an einem Beispiel) –
@downvoter: lassen Sie einen Kommentar – Henrik