Application Office ne se ferme pas après l'automatisation à partir du client Visual Studio .net

Traductions disponibles Traductions disponibles
Numéro d'article: 317109 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Sommaire

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 ferme pas lorsque vous appelez la méthode Quit .

Cause

Lorsque les appels Visual Studio .net COM objet à partir de gérés code, il crée automatiquement un Runtime Callable Wrapper (RCW). Le wrapper RCW marshale les appels entre l'application .net et l'objet COM. Le wrapper RCW assure un le décompte de références sur l'objet COM. Par conséquent, si toutes les références n'ont pas été publié sur le wrapper RCW, l'objet COM ne s'arrête pas.

Résolution

Pour vous assurer que l'application Office se ferme, assurez-vous que que votre code automation répond aux critères suivants :
  • Déclarez chaque objet en tant que nouvelle variable. Par exemple, modifier la ligne de code suivante
    oBook = oExcel.Workbooks.Add()
    					
    comme suit :
    dim oBooks as Excel.Workbooks
    oBooks = oExcel.Workbooks
    oBook = oBooks.Add()
    					
  • Utilisation System.Runtime.InteropServices.Marshal.ReleaseComObject dans une boucle jusqu'à ce qu'elle renvoie la valeur 0 lorsque vous avez fini d'utiliser un objet. Le System.Runtime.InteropServices.Marshal.ReleaseComObject décrémente le décompte de références du wrapper RCW et la boucle permet de garantir que le composant COM sous-jacent est libéré, quel que soit la procédure autant de fois qu'il a ressaisir le CLR.
  • Pour libérer la référence à la variable, définissez la variable égal à Nothing ou NULL.
  • Utiliser le Quittez méthode de l'objet d'application Office pour indiquer au serveur pour Mettez hors tension.

Statut

Ceci comportement est voulu par la conception.

Plus d'informations

Procédure pour reproduire le comportement

  1. Démarrez Visual Studio .net.
  2. Dans le menu fichier , cliquez sur Nouveau , puis sur projet. Sous Projets Visual Basic, sélectionnez Application Windows , puis cliquez sur OK. Form1 est créé par défaut.
  3. Ajoutez une référence à la Bibliothèque d'objets Microsoft Excel. Pour ce faire, 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'objets pour Excel, puis cliquez sur Sélectionner.

      Pour Microsoft Excel 2002 : bibliothèque d'objets Microsoft Excel 10.0

      Remarque : Si vous ne le n'avez pas déjà fait, il est recommandé que vous Téléchargez et installez le Microsoft Office XP assemblys PIA (Primary Interop Assemblies). Pour plus d'informations sur les assemblys PIA Office XP, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
      328912Microsoft Office XP primary interop assemblies (PIAs) sont disponibles au téléchargement
      Pour Microsoft Office Excel 2003 : bibliothèque d'objets Microsoft Excel 11.0
    3. Cliquez sur OK dans la boîte de dialogue Ajouter une référence pour accepter vos sélections.
  4. Dans le menu affichage , cliquez sur boîte à outilset puis faites glisser un contrôle Button vers Form1.
  5. Double-cliquez sur Button1. La fenêtre code pour le 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 code
        Private Sub Button1_Click(ByVal sender As System.Object, _
           ByVal e As System.EventArgs) Handles Button1.Click
        End Sub
    					
    avec les éléments suivants :
    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 le Gestionnaire des tâches Windows. Dans Visual Studio, afficher la Fenêtre de sortie pour voir les messages de débogage. Cliquez sur le bouton de commande et notez que une instance de Excel.exe apparaît dans la liste des processus .
  10. L'instance d'Excel s'exécute toujours dans la liste des tâches même une fois l'application terminée en mode veille. Fermez la boîte de dialogue et notez que Excel n'apparaît plus dans la liste des processus .
  11. Lorsque vous implémentez les étapes dans la section « Résolution », l'application Office se ferme après la libération de la dernière variable. Remplacer le fonction à l'étape 5 avec le 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érencer le code de la fonction NAR() :
private void NAR(object o)
{
    try 
    {
        while (System.Runtime.InteropServices.Marshal.ReleaseComObject(o) > 0) ;
    }
    catch {}
    finally 
    {
        o = null;
    }
}
Remarque : .NET Framework 2.0, vous pouvez utiliser System.Runtime.InteropServices.Marshal.FinalReleaseComObject au lieu de while appelant System.Runtime.InteropServices.Marshal.ReleaseComObject pour obtenir le même résultat en boucle.

Résolution des problèmes

Notez que si vous suivez les étapes décrites dans la Section « Étapes pour reproduire le comportement » et le serveur toujours ne pas s' vers le bas, vous pouvez utiliser le GC.Collect() méthode et la GC.WaitForPendingFinalizers() méthode après avoir relâché le dernier objet. Dans la mesure où le runtime effectue une opération garbage collection sur le wrapper RCW, le GC .Collect() méthode force le garbage collector à s'exécuter et peut libérer tout le wrapper RCW a encore des références. Le GC .Collect() méthode essaie de récupérer la mémoire maximale disponible. Notez que Cela ne garantit pas que toute la mémoire est récupérée.

Propriétés

Numéro d'article: 317109 - Dernière mise à jour: vendredi 3 août 2012 - Version: 1.0
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Visual Basic .NET 2003 Initiation
  • Microsoft Visual C# .NET 2003 Initiation
  • Microsoft Visual Basic .NET 2002 Initiation
  • Microsoft Visual C# .NET 2002 Initiation
Mots-clés : 
kbautomation kbprb kbmt KB317109 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 317109
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com