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)