KB0203: Come usare Office Automation da codice gestito (C#, Visual Basic, .NET)

  1. Home
  2. Risorse
  3. Knowledge base
  4. 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.View

    In 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)