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)