Considerare il seguente codice C# utilizzando un oggetto COM.Rilascio di oggetti COM temporanei
MyComObject o = new MyComObject;
try
{
var baz = o.Foo.Bar.Baz;
try
{
// do something with baz
}
finally
{
Marshal.ReleaseComObject(baz);
}
}
finally
{
Marshal.ReleaseComObject(o);
}
Questo rilascerà gli oggetti COM o
e baz
, ma non gli oggetti temporanei returnd da o.Foo
e o.Foo.Bar
. Ciò può causare problemi quando questi oggetti contengono una grande quantità di memoria non gestita o altre risorse.
Una soluzione ovvia ma brutta sarebbe, per ingombrare ulteriormente il codice con try-finally
e Marshal.ReleaseComObject
. Vedere C# + COM Interop, deterministic release
Per aggirare il problema, ho creato una classe di supporto
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);
}
}
Usage:
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
}
Le mie domande: ci sono potenziali problemi con questo codice? Qualcuno ha una soluzione più elegante?
(aggiunto un esempio utilizzando l'approccio albero di espressione) –
@downvoter: si prega di lasciare un commento – Henrik