Base de dados de conhecimento KB0203

Como usar o Office Automation a partir do código gerenciado (C#, Visual Basic, .NET)

Problema

O Office usa COM para expor objetos de automação. No código gerenciado, conforme usado por C# e Visual Basic, os objetos COM são envoltos em Runtime Callable Wrappers (RCWs). Sem qualquer ação especial pelo programador, os objetos COM envoltos em RCWs são liberados somente no Garbage Collection, que, na ausência de pressão de memória poderá ser nunca.

Solução

Para de forma determinística liberar os objetos COM, libere todos os objetos que receber do Office com System.Runtime.InteropServices.Marshal.ReleaseComObject após ter terminado de usá-los.

Observação

  • Não use System.Runtime.InteropServices.Marshal.FinalReleaseComObject porque isso liberará o objeto COM, mesmo se outros add-ins gerenciados ainda o estiverem usando.
  • Não acesse nenhum objeto por meio de outro, por exemplo:
    // C#
    // Wrong
    PowerPoint.View view = Application.ActiveWindow.View;
    
    ' Visual Basic
    ' Wrong
    Dim view As PowerPoint.View = Application.ActiveWindow.View
    

    Nesse caso, o ActiveWindow cria um PowerPoint.DocumentWindow temporário que não é liberado.

    Em vez disso, o atribua a uma variável e o libere:

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