Μετάβαση στο κύριο περιεχόμενο
Υποστήριξη
Είσοδος με Microsoft
Είσοδος ή δημιουργία λογαριασμού.
Γεια σας,
Επιλέξτε διαφορετικό λογαριασμό.
Έχετε πολλούς λογαριασμούς
Επιλέξτε τον λογαριασμό με τον οποίο θέλετε να εισέλθετε.

Ανατρέξτε στα άλλα προϊόντα για τα οποία ισχύει αυτό το άρθρο.

Συμπτώματα

Όταν αυτοματοποιείτε μια εφαρμογή Microsoft Office από το Microsoft Visual Basic .NET ή το Microsoft Visual C# .NET, η εφαρμογή Office δεν κλείνει όταν καλείτε τη μέθοδο Quit.

Αιτία

Όταν Visual Studio .NET καλεί ένα αντικείμενο COM από διαχειριζόμενο κώδικα, δημιουργεί αυτόματα ένα αναδίπλωση κλήσεων χρόνου εκτέλεσης (RCW). Το RCW καλεί μεταξύ της εφαρμογής .NET και του αντικειμένου COM. Η συνάρτηση RCW διατηρεί το πλήθος αναφορών στο αντικείμενο COM. Επομένως, εάν δεν έχουν κυκλοφορήσει όλες οι αναφορές στην RCW, το αντικείμενο COM δεν κλείνει.

Επίλυση

Για να βεβαιωθείτε ότι η Office εφαρμογή θα εξέλθει, καθορίστε εάν ο κώδικας αυτοματοποίησης πληροί τα ακόλουθα κριτήρια:

  • Δηλώστε κάθε αντικείμενο ως νέα μεταβλητή. Για παράδειγμα, αλλάξτε την ακόλουθη γραμμή κώδικα:

    oBook = oExcel.Workbooks.Add()
    

    Αλλάξτε το ως εξής:

    dim oBooks as Excel.Workbooks
    oBooks = oExcel.Workbooks
    oBook = oBooks.Add()
    
  • Χρησιμοποιήστε το System.Runtime.InteropServices.ReleaseComObject σε βρόχο μέχρι να επιστρέψει την τιμή 0 όταν ολοκληρώσετε τη χρήση ενός αντικειμένου. Το System.Runtime.InteropServices.ReleaseComObject αποκρυπτογραφεί το πλήθος των αναφορών του RCW και ο βρόχος διασφαλίζει ότι το υποκείμενο στοιχείο COM θα κυκλοφορήσει ανεξάρτητα από το πόσες φορές έχει εισαχθεί ξανά στο CLR.

  • Για να αποδεσμεέσετε την αναφορά στη μεταβλητή, ορίστε τη μεταβλητή σε Τίποτα ή Null.

  • Χρησιμοποιήστε τη μέθοδο Quit του αντικειμένου εφαρμογής Office για να πείτε στο διακομιστή να τερματίσει τη λειτουργία του.

Κατάσταση

Αυτή η συμπεριφορά οφείλεται στη σχεδίαση.

Περισσότερες πληροφορίες

Βήματα για την αναπαραγωγή της συμπεριφοράς

  1. Ξεκινήστε Visual Studio .NET.

  2. Στο μενού Αρχείο, κάντε κλικ στην επιλογή Δημιουργία και, στη συνέχεια, κάντε κλικ στην επιλογή Project. Στην περιοχή Έργα Visual Basic, επιλέξτε Windows Εφαρμογή και, στη συνέχεια, κάντε κλικ στο κουμπί OK.

    Σημείωση Η φόρμα1 δημιουργείται από προεπιλογή.

  3. Προσθέστε μια αναφορά στη Βιβλιοθήκη αντικειμένων Microsoft Excel. Για να το κάνετε αυτό, ακολουθήστε τα εξής βήματα:

    1. Στο μενού Project, κάντε κλικ στην επιλογή Προσθήκη αναφοράς.

    2. Στην καρτέλα COM, εντοπίστε τη Βιβλιοθήκη αντικειμένων για Excel και, στη συνέχεια, κάντε κλικ στο στοιχείο Επιλογή.

      Για Microsoft Excel 2002: Microsoft Excel Βιβλιοθήκη

      αντικειμένων 10.0 Εάν δεν το έχετε κάνει ήδη, συνιστάται η λήψη και η εγκατάσταση των Microsoft Office XP Primary Interop Assemblies (PIAs).

      Για περισσότερες πληροφορίες σχετικά με Office XP PIAs, ανατρέξτε στο ακόλουθο άρθρο της Γνωσιακής βάσης της Microsoft:

      328912 Microsoft Office κύρια συνελεύσεων XP (PIAs) είναι διαθέσιμες για λήψη
        Για Microsoft Office Excel 2003: Microsoft Excel βιβλιοθήκη αντικειμένων 11.0

    3. Κάντε κλικ στο κουμπί OK στο παράθυρο διαλόγου Προσθήκη αναφορών για να αποδεχτείτε τις επιλογές σας.

  4. Στο μενού Προβολή, κάντε κλικ στην επιλογή Εργαλειοθήκη και, στη συνέχεια, σύρετε ένα στοιχείο ελέγχου "Κουμπί" στη Φόρμα1.

  5. Κάντε διπλό κλικ στο Κουμπί1.

    Σημείωση Εμφανίζεται το παράθυρο κώδικα για τη φόρμα.

  6. Προσθέστε τον παρακάτω κώδικα στο επάνω μέρος του form1.vb:

    Imports Microsoft.Office.Interop
    
  7. Αντικαταστήστε τον ακόλουθο κώδικα στο παράθυρο κώδικα:

        Private Sub Button1_Click(ByVal sender As System.Object, _
           ByVal e As System.EventArgs) Handles Button1.Click
        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 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. Πατήστε το πλήκτρο F5 για να εκτελέσετε την εφαρμογή.

  9. Ανοίξτε τη Διαχείριση Εργασιών Windows. Στο Visual Studio, εμφανίστε το παράθυρο Έξοδος για να δείτε τα μηνύματα εντοπισμού σφαλμάτων. Κάντε κλικ στο κουμπί εντολής. Παρατηρήστε ότι μια παρουσία Excel.exe εμφανίζεται στη λίστα Διεργασίες.

  10. Η παρουσία των Excel εξακολουθεί να εκτελείται στη λίστα εργασιών ακόμη και αφού η εφαρμογή έχει ολοκληρώσει τη χρήση της. Κλείστε το παράθυρο διαλόγου και παρατηρήστε ότι Excel δεν εμφανίζεται πλέον στη λίστα Διεργασίες.

  11. Όταν κάνετε τα βήματα στην ενότητα "Ανάλυση", η εφαρμογή Office θα εξέλθει αφού κυκλοφορήσει την τελευταία μεταβλητή. Αντικαταστήστε τη συνάρτηση στο βήμα 5 χρησιμοποιώντας τον παρακάτω κώδικα:

      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
    

Εάν χρησιμοποιείτε Visual C# .NET, ανατρέξτε στον κώδικα για τη συνάρτηση NAR():

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

Σημείωση Ξεκινώντας από το .NET Framework 2.0, μπορείτε να χρησιμοποιήσετε το System.Runtime.InteropServices.Fast.FinalReleaseComObject αντί για το ταυτόχρονο βρόχο κλήσεων System.Runtime.InteropServices.ReleaseComObject για να επιτύχετε το ίδιο αποτέλεσμα.
 

Αντιμετώπιση προβλημάτων

Σημείωση Εάν ακολουθήσετε τα βήματα που περιγράφονται στην ενότητα "Βήματα για την αναπαραγωγή της συμπεριφοράς" και ο διακομιστής εξακολουθεί να μην τερματίζεται, μπορείτε να χρησιμοποιήσετε τη GC. Μέθοδος Collect() και η GC. Μέθοδος WaitForPendingFinalizers() μετά την κυκλοφορία του τελευταίου αντικειμένου. Επειδή ο χρόνος εκτέλεσης εκτελεί συλλογές αποκομμάτων σε RCW, ο GC. Η μέθοδος Collect() επιβάλλει στον κάδο ανακύκλωσης να εκτελεστεί και μπορεί να δημοσιεύσει τυχόν αναφορές που εξακολουθεί να έχει η RCW. Η συνάρτηση GC. Η μέθοδος Collect() προσπαθεί να ανακτήσει τη μέγιστη διαθέσιμη μνήμη. Παρατηρήστε ότι αυτό δεν εγγυάται ότι θα ανακτηθεί όλη η μνήμη.

Ισχύει για

Αυτό το άρθρο ισχύει επίσης για τα εξής:

  • Microsoft Visual Basic .NET (όλες οι εκδόσεις)

  • Microsoft Visual C# .NET (όλες οι εκδόσεις)

  • Microsoft Office 2016 (όλες οι εκδόσεις)

  • Microsoft Office 2013 (όλες οι εκδόσεις)

Χρειάζεστε περισσότερη βοήθεια;

Θέλετε περισσότερες επιλογές;

Εξερευνήστε τα πλεονεκτήματα της συνδρομής, περιηγηθείτε σε εκπαιδευτικά σεμινάρια, μάθετε πώς μπορείτε να προστατεύσετε τη συσκευή σας και πολλά άλλα.

Οι κοινότητες σάς βοηθούν να κάνετε και να απαντάτε σε ερωτήσεις, να δίνετε σχόλια και να ακούτε από ειδικούς με πλούσια γνώση.

Σας βοήθησαν αυτές οι πληροφορίες;

Πόσο ικανοποιημένοι είστε με τη γλωσσική ποιότητα;
Τι επηρέασε την εμπειρία σας;
Πατώντας "Υποβολή" τα σχόλια σας θα χρησιμοποιηθούν για τη βελτίωση των προϊόντων και των υπηρεσιών της Microsoft. Ο διαχειριστής IT θα έχει τη δυνατότητα να συλλέξει αυτά τα δεδομένα. Δήλωση προστασίας προσωπικών δεδομένων.

Σας ευχαριστούμε για τα σχόλιά σας!

×