Εφαρμογή του Office κλείσει μετά την αυτοματοποίηση από Visual Studio .NET υπολογιστή-πελάτη

Συμπτώματα

Όταν μπορείτε να αυτοματοποιήσετε μια εφαρμογή του 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.WorkbooksoBooks = oExcel.Workbooks
    oBook = oBooks.Add()

  • Χρησιμοποιήστε το System.Runtime.InteropServices.Marshal.ReleaseComObject σε μια επανάληψη μέχρι να επιστρέφει την τιμή 0 όταν ολοκληρώσετε τη χρήση του αντικειμένου. Ο μειώνεται System.Runtime.InteropServices.Marshal.ReleaseComObject το μετρητή αναφοράς του το RCW και ο βρόχος θα εξασφαλίσει ότι το υποκείμενο στοιχείο COM κυκλοφορεί ανεξάρτητα από τον τρόπο πολλές φορές αυτή έχει εισαγάγει εκ νέου το CLR.
  • Για να απελευθερώσετε την αναφορά στη μεταβλητή, ορίστε τη μεταβλητή που είναι ίση με τίποτα ή Null.
  • Χρησιμοποιήστε τη μέθοδο Quit του αντικειμένου application Office για να πείτε στο διακομιστή για να τερματίσετε τη λειτουργία.

Κατάσταση

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

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

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

  1. Ξεκινήστε το Visual Studio .NET.
  2. Στο μενού αρχείο , κάντε κλικ στην επιλογή Δημιουργία και, στη συνέχεια, κάντε κλικ στο έργο. Στην περιοχή Έργα της Visual Basic, επιλέξτε Εφαρμογή των Windows και κάντε κλικ στο κουμπί OK. Από προεπιλογή, δημιουργείται η φόρμα Form1.
  3. Προσθέστε μια αναφορά στη Βιβλιοθήκη αντικειμένων του Microsoft Excel. Για να το κάνετε αυτό, ακολουθήστε τα εξής βήματα:
    1. Στο μενού ' έργο ', κάντε κλικ στο κουμπί Προσθήκη αναφοράς.
    2. Στην καρτέλα " COM ", εντοπίστε τη βιβλιοθήκη αντικειμένων για το Excel και, στη συνέχεια, κάντε κλικ στην επιλογή.

      Για το Microsoft Excel 2002: βιβλιοθήκη αντικειμένων του Microsoft Excel έκδοση 10.0

      Σημείωση Εάν δεν το έχετε κάνει ήδη, συνιστάται να κάνετε λήψη και να εγκαταστήσετε το Microsoft Office XP πρωτεύον Interop (PIA).

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

      328912 το Microsoft Office XP κύρια σύνολα διαλειτουργικότητας (PIA) είναι διαθέσιμο για λήψη

      Για το Microsoft Office Excel 2003: το Microsoft Excel 11.0 αντικειμένου βιβλιοθήκης
    3. Κάντε κλικ στο κουμπί OK στο πλαίσιο διαλόγου " Προσθήκη αναφορών " για να αποδεχτείτε τις επιλογές σας.
  4. Στο μενού Προβολή , κάντε κλικ στην εργαλειοθήκηκαι, στη συνέχεια, σύρετε ένα στοιχείο ελέγχου κουμπιού Form1.
  5. Κάντε διπλό κλικ στο Button1. Εμφανίζεται το παράθυρο κώδικα της φόρμας.
  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.Marshal.FinalReleaseComObject αντί για το χωρίς επανάληψη κλήσης System.Runtime.InteropServices.Marshal.ReleaseComObject για να επιτύχετε το ίδιο αποτέλεσμα.

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

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

Αναγνωριστικό άρθρου: 317109 - Τελευταία αναθεώρηση: 16 Ιαν 2017 - Αναθεώρηση: 1

Microsoft Visual Basic .NET 2003 Standard Edition, Microsoft Visual C# .NET 2003 Standard Edition, Microsoft Visual Basic .NET 2002 Standard Edition, Microsoft Visual C# .NET 2002 Standard Edition

Σχόλια