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

Μεταφράσεις άρθρων Μεταφράσεις άρθρων
Αναγν. άρθρου: 317109 - Δείτε τα προϊόντα στα οποία αναφέρεται το συγκεκριμένο άρθρο.
Ανάπτυξη όλων | Σύμπτυξη όλων

Σε αυτήν τη σελίδα

Συμπτώματα

Κατά τον αυτοματισμό μια εφαρμογή του Microsoft Office από την Microsoft Visual Basic .NET ή Microsoft Visual C# .NET, η εφαρμογή του Office δεν κλείνει κατά την κλήση τουΚάντε έξοδοΗ μέθοδος.

Αιτία

Όταν το 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.Marshal.ReleaseComObjectΌταν έχετε ολοκληρώσει χρησιμοποιώντας ένα αντικείμενο. Αυτή η αναφορά μέτρηση από το RCW μειώνεται.
  • Για να απελευθερώσετε την αναφορά στη μεταβλητή, ορίσετε ίση με τη μεταβλητήnothingήNULL.
  • Χρήση τουΚάντε έξοδοη μέθοδος στο αντικείμενο εφαρμογής του Office, για να ενημερώσετε το διακομιστή για να τερματίσετε τη λειτουργία.

Κατάσταση

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

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

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

  1. Ξεκινήστε το Visual Studio .NET.
  2. Στο διακομιστήFILEμενού, κάντε κλικ στο κουμπίΝέακαι, στη συνέχεια, κάντε κλικ στο κουμπίΤο έργο. underΈργα της Visual BasicΕπιλογήΕφαρμογή των Windowsκαι κάντε κλικ στο κουμπίOk. Φόρμα1 δημιουργείται από προεπιλογή.
  3. Προσθέστε μια αναφορά για τοΒιβλιοθήκη αντικειμένων του Microsoft Excel. Για να το κάνετε αυτό, ακολουθήστε τα εξής βήματα: (Use the tools in the Windows Recovery Environment to repair Windows Vista. To do this, follow these steps:):
    1. Στο διακομιστήΤο έργομενού, κάντε κλικ στο κουμπίΠροσθήκη αναφοράς.
    2. Στο διακομιστήComκαρτέλα, εντοπίστε τη βιβλιοθήκη αντικειμένων για το Excel και, στη συνέχεια, κάντε κλικ στο κουμπίΕπιλογή.

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

      ΣΗΜΕΙΩΣΗΕάν δεν το έχετε ήδη κάνει, συνιστάται να λήψη και να εγκαταστήσετε το Microsoft Office XP Primary Interop συγκροτήσεις (στοιχεία PIA).Για πρόσθετες πληροφορίες σχετικά με τα στοιχεία PIA του Office XP, κάντε κλικ στον αριθμό του άρθρου παρακάτω για να προβάλετε το άρθρο της Γνωσιακής Βάσης της Microsoft:
      328912Τα κύρια σύνολα διαλειτουργικότητας (PIA) των Microsoft Office XP είναι διαθέσιμα για λήψη
      Για το Microsoft Office Excel 2003:Βιβλιοθήκη αντικειμένων του Microsoft Excel 11.0
    3. Κάντε κλικOkΣτοΠροσθήκη αναφορέςπαράθυρο διαλόγου για να αποδεχθείτε τις επιλογές σας.
  4. Στο διακομιστήViewμενού, κάντε κλικ στο κουμπίΕργαλειοθήκη, και στη συνέχεια σύρετε μιαΚουμπίΈλεγχος σε Φόρμα1.
  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 στο στοΔιαδικασίεςΛίστα (List).
  10. Την περίοδο λειτουργίας του Excel εξακολουθεί να εκτελείται στη λίστα εργασιών ακόμη και μετά την ολοκλήρωση της εφαρμογής σε κατάσταση αναστολής λειτουργίας. Close the dialog box and note that Excel no longer appears in theΔιαδικασίεςΛίστα (List).
  11. When you implement the steps in the "Resolution" section, the Office application quits after it releases the last variable. Replace the function in Step 5 with the following code:
      Private Sub NAR(ByVal o As Object)
        Try
          System.Runtime.InteropServices.Marshal.ReleaseComObject(o)
        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
    					
If you are using Visual C# .NET, reference the code for theNAR()Function:
private void NAR(object o)
{
    try 
    {
        System.Runtime.InteropServices.Marshal.ReleaseComObject(o);
    }
    catch {}
    finally 
    {
        o = null;
    }
}

ΑΝΤΙΜΕΤΩΠΙΣΗ ΠΡΟΒΛΗΜΑΤΩΝ

Note that if you follow the steps that are described in the "Steps to Reproduce the Behavior" section, and the server still does not shut down, you can use theGC.Collect()η μέθοδος και τοGC.WaitForPendingFinalizers()method after you release the last object. Because the runtime performs garbage collection on the RCW, theGC.Collect()method forces the garbage collector to run and might release any references that the RCW still has. Για ναGC.Collect()method tries to reclaim the maximum memory that is available. Note that this does not guarantee that all memory will be reclaimed.

Ιδιότητες

Αναγν. άρθρου: 317109 - Τελευταία αναθεώρηση: Τρίτη, 21 Δεκεμβρίου 2010 - Αναθεώρηση: 2.0
Οι πληροφορίες σε αυτό το άρθρο ισχύουν για:
  • 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
Λέξεις-κλειδιά: 
kbautomation kbprb kbmt KB317109 KbMtel
Μηχανικά μεταφρασμένο
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της Microsoft και όχι ανθρώπινης μετάφρασης. Η Microsoft σάς προσφέρει άρθρα που είναι προϊόντα ανθρώπινης αλλά και μηχανικής μετάφρασης έτσι ώστε να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής Βάσης μας στη δική σας γλώσσα. Ωστόσο, ένα άρθρο που έχει προκύψει από μηχανική μετάφραση δεν είναι πάντα άριστης ποιότητας. Ενδέχεται να περιέχει λεξιλογικά, συντακτικά ή γραμματικά λάθη, όπως ακριβώς τα λάθη που θα έκανε ένας μη φυσικός ομιλητής επιχειρώντας να μιλήσει τη γλώσσα σας. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες της. Επίσης, η Microsoft πραγματοποιεί συχνά ενημερώσεις στο λογισμικό μηχανικής μετάφρασης.
Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη:317109

Αποστολή σχολίων

 

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