Come utilizzare Office Automation dal codice gestito (C#, Visual Basic, .NET)
Problema
Office utilizza COM per esporre oggetti di automazione. Nel codice gestito, come quello usato da C# e Visual Basic, gli oggetti COM sono soggetti a wrapping in Runtime Callable Wrapper (RCW). Senza alcuna azione speciale dal programmatore, gli oggetti COM soggetti a wrapping in RCW vengono rilasciati solo su Garbage Collection, cosa che in assenza di pressione di memoria potrebbe non succedere mai.
Soluzione
Per rilasciare deterministicamente oggetti COM, rilasciare tutti gli oggetti ricevuti da Office con System.Runtime.InteropServices.Marshal.ReleaseComObject al termine del loro utilizzo.
Nota
-
Non usare System.Runtime.InteropServices.Marshal.FinalReleaseComObject perché rilascerà l’oggetto COM anche se altri add-in gestiti lo stanno ancora utilizzando.
-
Non accedere a un oggetto attraverso un altro, ad esempio:
// C# // Wrong PowerPoint.View view = Application.ActiveWindow.View;
' Visual Basic ' Wrong Dim view As PowerPoint.View = Application.ActiveWindow.View
In questo caso, ActiveWindow crea una finestra temporanea PowerPoint.Document, che non viene rilasciata.
Invece, assegnare una variabile e rilasciare:
// C# PowerPoint.DocumentWindow wnd = Application.ActiveWindow; PowerPoint.View view = wnd.View; System.Runtime.InteropServices.Marshal.ReleaseComObject(wnd); System.Runtime.InteropServices.Marshal.ReleaseComObject(view);
' Visual Basic Dim wnd As PowerPoint.DocumentWindow = Application.ActiveWindow Dim view As PowerPoint.View = wnd.View System.Runtime.InteropServices.Marshal.ReleaseComObject(wnd) System.Runtime.InteropServices.Marshal.ReleaseComObject(view)