Comment utiliser Office Automation à partir du code compilé (C#, Visual Basic, .NET)
Problème
Office utilise COM pour exposer les objets d'automatisation. Dans le code compilé, tel qu'utilisé par C# et Visual Basic, les objets COM sont incorporés dans des Runtime Callable Wrappers (RCWs). En l'absence d'action spécifique du programmeur, les objets COM intégrés dans les RCWs ne sont libérés qu'avec une procédure de récupération d'espace. Or, cette procédure peut n'être jamais executée s'il n'y a pas de besoin de libérer de la mémoire.
Solution
Afin de libérer les objets COM de façon déterministe, libérez tous les objets que vous recevez de la part d'Office à l'aide de System.Runtime.InteropServices.Marshal.ReleaseComObject une fois que vous avez fini de les utiliser.
Remarque
-
N'utilisez pas System.Runtime.InteropServices.Marshal.FinalReleaseComObject, car il libèrera l'objet COM même si d'autres add-ins gérés l'utilisent encore.
-
Évitez d'accéder à un objet par le biais d'un autre, c-à-d :
// C# // Wrong PowerPoint.View view = Application.ActiveWindow.View;
' Visual Basic ' Wrong Dim view As PowerPoint.View = Application.ActiveWindow.View
Dans ce cas, ActiveWindow créé un PowerPoint.DocumentWindow temporaire qui n'est pas libéré.
Attribuez-le plutôt à une variable et libérez-le :
// 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)