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
-
Démarrez Visual Studio .NET.
-
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. -
Ajoutez une référence à la Microsoft Excel d’objets. Pour cela, procédez comme suit :
-
Dans le menu Projet, cliquez sur Ajouter une référence.
-
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 -
Cliquez sur OK dans la boîte de dialogue Ajouter des références pour accepter vos sélections.
-
-
Dans le menu Affichage, cliquez sur Boîte à outils, puis faites glisser un contrôle de bouton dans Form1.
-
Double-cliquez sur Bouton1.
Remarque La fenêtre de code du formulaire s’affiche. -
Ajoutez le code suivant au début de Form1.vb :
Imports Microsoft.Office.Interop
-
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
-
Appuyez sur F5 pour exécuter l'application.
-
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.
-
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.
-
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)