Base de conocimientos KB0203

Cómo usar los servicios de automatización de Office desde código administrado (C#, Visual Basic, .NET)

Problema

Office usa COM para exponer objetos de automatización. En código administrado, como el usado por C# y Visual Basic, los objetos COM se compilan en contenedores RCW. Sin que el programador tenga que hacer nada especial, los objetos COM compilados en contenedores RCW solo se liberan en recolección de elementos no utilizados, pero esto bien podría no suceder nunca si no hay presión de memoria.

Solución

Para liberar a propósito objetos COM, libere todos los objetos que reciba de Office con System.Runtime.InteropServices.Marshal.ReleaseComObject cuando haya terminado de usarlos.

Nota

  • No use System.Runtime.InteropServices.Marshal.FinalReleaseComObject porque liberará el objeto COM incluso si hay otros complementos administrados que aún lo utilizan.
  • No acceda a ningún objeto a través de otro, p. ej.:
    // C#
    // Wrong
    PowerPoint.View view = Application.ActiveWindow.View;
    
    ' Visual Basic
    ' Wrong
    Dim view As PowerPoint.View = Application.ActiveWindow.View
    

    En este caso, ActiveWindow crea un objeto temporal PowerPoint.DocumentWindow, que no se libera.

    En su lugar, asígnelo a una variable y libérelo:

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