Se connecter avec Microsoft
S'identifier ou créer un compte.
Bonjour,
Sélectionnez un autre compte.
Vous avez plusieurs comptes
Choisissez le compte avec lequel vous voulez vous connecter.

Consultez les autres produits que s’applique cet article.

Symptômes

Lorsque vous automatisez une application Microsoft Office à partir de Microsoft Visual Basic .NET ou Microsoft Visual C# .NET, l’application Office ne se quitte pas lorsque vous appelez la méthode Quitter.

Cause

Lorsque Visual Studio .NET appelle un objet COM à partir d’un code géré, il crée automatiquement un runtime Callable Wrapper (RCW). Le RCW appelle l’application .NET et l’objet COM. Le RCW conserve un nombre de références sur l’objet COM. Par conséquent, si toutes les références n’ont pas été publiées sur le RCW, l’objet COM ne se quitte pas.

Résolution

Pour vous assurer que l’application Office, déterminez si votre code d’automatisation répond aux critères suivants :

  • Déclarer chaque objet comme étant une nouvelle variable. Par exemple, modifiez la ligne de code suivante :

    oBook = oExcel.Workbooks.Add()
    

    Modifiez ce qui suit :

    dim oBooks as Excel.Workbooks
    oBooks = oExcel.Workbooks
    oBook = oBooks.Add()
    
  • Utilisez System.Runtime.InteropServices.ReleaseComObject dans une boucle jusqu’à ce qu’il renvoie 0 lorsque vous avez fini d’utiliser un objet. System.Runtime.InteropServices.Jacente.ReleaseComObject décrémente le nombre de références du RCW et la boucle permet de s’assurer que le composant COM sous-jacent est diffusé quel que soit le nombre de fois qu’il est entré de nouveau le CLR.

  • Pour libérer la référence à la variable, définissez la variable sur Rien ou Null.

  • Utilisez la méthode Quitter de l’objet Office’application pour indiquer au serveur d’arrêter.

État

Ce comportement est inhérent au produit.

Informations supplémentaires

Étapes à suivre pour reproduire le comportement

  1. Démarrez Visual Studio .NET.

  2. Dans le menu Fichier, cliquez sur Nouveau, puis sur Project. Sous Visual Basic de projets, sélectionnez Windows Application, puis cliquez sur OK.

    Remarque Form1 est créé par défaut.

  3. Ajoutez une référence à la Microsoft Excel d’objets. Pour cela, procédez comme suit :

    1. Dans le menu Projet, cliquez sur Ajouter une référence.

    2. Sous l’onglet COM, recherchez la bibliothèque d’Excel, puis cliquez sur Sélectionner.

      Pour Microsoft Excel 2002 : Microsoft Excel LibraryNote d’objets 10.0

      Si vous ne l’avez pas déjà fait, nous vous recommandons de télécharger et d’installer les assemblys interop principales Microsoft Office XP.

      Pour plus d’informations sur Office PIAS XP, voir l’article suivant de la Base de connaissances Microsoft :

      328912 Microsoft Office les assemblys interop principales (PIA) XP peuvent être téléchargées
        Pour Microsoft Office Excel 2003 : Microsoft Excel d’objets 11.0

    3. Cliquez sur OK dans la boîte de dialogue Ajouter des références pour accepter vos sélections.

  4. Dans le menu Affichage, cliquez sur Boîte à outils, puis faites glisser un contrôle de bouton dans Form1.

  5. Double-cliquez sur Bouton1.

    Remarque La fenêtre de code du formulaire s’affiche.

  6. Ajoutez le code suivant au début de Form1.vb :

    Imports Microsoft.Office.Interop
    
  7. Remplacez le code suivant dans la fenêtre de code :

        Private Sub Button1_Click(ByVal sender As System.Object, _
           ByVal e As System.EventArgs) Handles Button1.Click
        End Sub
    

    Remplacez le code suivant :

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim oApp As New Excel.Application()
        Dim oBook As Excel.Workbook = oApp.Workbooks.Add
        Dim oSheet As Excel.Worksheet = oApp.ActiveSheet
    
        oSheet = Nothing
        oBook.Close(False)
        oBook = Nothing
        oApp.Quit()
        oApp = Nothing
    
        Debug.WriteLine("Sleeping...")
        System.Threading.Thread.Sleep(5000)
        Debug.WriteLine("End Excel")
    End Sub
    
  8. Appuyez sur F5 pour exécuter l'application.

  9. Ouvrez Windows Gestionnaire des tâches. Dans Visual Studio, affichez la fenêtre Sortie pour afficher les messages de débogage. Cliquez sur le bouton de commande. Notez qu’une instance de Excel.exe apparaît dans la liste Processus.

  10. L’instance de Excel s’exécute toujours dans la liste des tâches même après que l’application a fini de dormir. Fermez la boîte de dialogue et remarquez qu Excel n’apparaît plus dans la liste Processus.

  11. Lorsque vous devez suivre les étapes de la section « Résolution », l’Office l’application se quitte après la publication de la dernière variable. Remplacez la fonction à l’étape 5 à l’aide du code suivant :

      Private Sub NAR(ByVal o As Object)
        Try
          While (System.Runtime.InteropServices.Marshal.ReleaseComObject(o) > 0)
          End While
        Catch
        Finally
          o = Nothing
        End Try
      End Sub
    
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim oApp As New Excel.Application()
        Dim oBooks As Excel.Workbooks = oApp.Workbooks
        Dim oBook As Excel.Workbook = oBooks.Add
        Dim oSheet As Excel.Worksheet = oApp.ActiveSheet
    
        NAR(oSheet)
        oBook.Close(False)
        NAR(oBook)
        NAR(oBooks)
        oApp.Quit()
        NAR(oApp)
    
        Debug.WriteLine("Sleeping...")
        System.Threading.Thread.Sleep(5000)
        Debug.WriteLine("End Excel")
    End Sub
    

Si vous utilisez Visual C# .NET, référencez le code pour la fonction CENTRE.ACTUALITÉ() :

private void NAR(object o)
{
    try 
    {
        while (System.Runtime.InteropServices.Marshal.ReleaseComObject(o) > 0) ;
    }
    catch {}
    finally 
    {
        o = null;
    }
}

RemarqueS En commençant dans .NET Framework 2.0, vous pouvez utiliser System.Runtime.InteropServices.Souhaitez.FinalReleaseComObject au lieu de system.runtime.InteropServices.Ît.ReleaseComObject pour obtenir le même résultat.
 

Résolution des problèmes

Remarque Si vous suivez les étapes décrites dans la section « Étapes pour reproduire le comportement » et que le serveur ne s’arrête toujours pas, vous pouvez utiliser la PGC. méthode Collect() et PGC. Méthode WaitForPendingFinalizers() après la sortie du dernier objet. Étant donné que l’runtime effectue une collecte de poubelle sur le RCW, le PGC. La méthode Collecter() oblige le collecteur de poubelle à s’exécuter et risque de libérer toutes les références encore présentes dans le RCW. PGC. La méthode Collect() tente de récupérer la quantité maximale de mémoire disponible. Notez que cela ne garantit pas que toute la mémoire soit récupérée.

Produits concernés

Cet article s’applique également aux articles suivants :

  • Microsoft Visual Basic .NET (toutes les éditions)

  • Microsoft Visual C# .NET (toutes les éditions)

  • Microsoft Office 2016 (toutes les éditions)

  • Microsoft Office 2013 (toutes les éditions)

Besoin d’aide ?

Vous voulez plus d’options ?

Explorez les avantages de l’abonnement, parcourez les cours de formation, découvrez comment sécuriser votre appareil, etc.

Les communautés vous permettent de poser des questions et d'y répondre, de donner vos commentaires et de bénéficier de l'avis d'experts aux connaissances approfondies.

Ces informations vous ont-elles été utiles ?

Dans quelle mesure êtes-vous satisfait(e) de la qualité de la langue ?
Qu’est-ce qui a affecté votre expérience ?
En cliquant sur Envoyer, vos commentaires seront utilisés pour améliorer les produits et services de Microsoft. Votre administrateur informatique sera en mesure de collecter ces données. Déclaration de confidentialité.

Nous vous remercions de vos commentaires.

×