Knowledge base KB0203

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)