KB0203: Come usare Office Automation da codice gestito (C#, Visual Basic, .NET)
- Home
- Risorse
- Knowledge base
- KB0203
Problema
Office usa COM per esporre gli oggetti di automazione. Nel codice gestito, come quello usato da C# e Visual Basic, gli oggetti COM sono racchiusi in Runtime Callable Wrapper (RCW). Senza alcuna azione specifica da parte del programmatore, gli oggetti COM racchiusi in RCW vengono rilasciati solo durante la Garbage Collection, che in assenza di pressione sulla memoria potrebbe non avvenire mai.
Soluzione
Per rilasciare in modo deterministico gli oggetti COM, rilasciare tutti gli oggetti ricevuti da Office con System.Runtime.InteropServices.Marshal.ReleaseComObject dopo aver terminato di usarli.
Nota
-
Non usare System.Runtime.InteropServices.Marshal.FinalReleaseComObject perché rilascia l'oggetto COM anche se altri componenti aggiuntivi gestiti lo stanno ancora usando.
-
Non accedere a un oggetto tramite un altro, ad esempio:
// C# // Errato PowerPoint.View view = Application.ActiveWindow.View;' Visual Basic ' Errato Dim view As PowerPoint.View = Application.ActiveWindow.ViewIn questo caso, ActiveWindow crea un PowerPoint.DocumentWindow temporaneo, che non viene rilasciato.
Assegnarlo invece a una variabile e rilasciarlo:
// 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)