Knowledge base KB0203

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 componenti aggiuntivi 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)