Κατά τον αυτοματισμό μια εφαρμογή του 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, για να ενημερώσετε το διακομιστή για να τερματίσετε τη λειτουργία.
Αυτή η συμπεριφορά οφείλεται στη σχεδίαση.
Βήματα για την αναπαραγωγή της συμπεριφοράς
- Ξεκινήστε το Visual Studio .NET.
- Στο διακομιστήFILEμενού, κάντε κλικ στο κουμπίΝέακαι, στη συνέχεια, κάντε κλικ στο κουμπίΤο έργο. underΈργα της Visual BasicΕπιλογήΕφαρμογή των Windowsκαι κάντε κλικ στο κουμπίOk. Φόρμα1 δημιουργείται από προεπιλογή.
- Προσθέστε μια αναφορά για τοΒιβλιοθήκη αντικειμένων του Microsoft Excel. Για να το κάνετε αυτό, ακολουθήστε τα εξής βήματα: (Use the tools in the Windows Recovery Environment to repair Windows Vista. To do this, follow these steps:):
- Στο διακομιστήΤο έργομενού, κάντε κλικ στο κουμπίΠροσθήκη αναφοράς.
- Στο διακομιστήComκαρτέλα, εντοπίστε τη βιβλιοθήκη αντικειμένων για το Excel και, στη συνέχεια, κάντε κλικ στο κουμπίΕπιλογή.
Για το Excel 2002:Βιβλιοθήκη αντικειμένων του Microsoft Excel 10.0
ΣΗΜΕΙΩΣΗΕάν δεν το έχετε ήδη κάνει, συνιστάται να λήψη και να εγκαταστήσετε το Microsoft Office XP Primary Interop συγκροτήσεις (στοιχεία PIA).Για πρόσθετες πληροφορίες σχετικά με τα στοιχεία PIA του Office XP, κάντε κλικ στον αριθμό του άρθρου παρακάτω για να προβάλετε το άρθρο της Γνωσιακής Βάσης της Microsoft:328912
(http://support.microsoft.com/kb/328912/
)
Τα κύρια σύνολα διαλειτουργικότητας (PIA) των Microsoft Office XP είναι διαθέσιμα για λήψη
Για το Microsoft Office Excel 2003:Βιβλιοθήκη αντικειμένων του Microsoft Excel 11.0 - Κάντε κλικOkΣτοΠροσθήκη αναφορέςπαράθυρο διαλόγου για να αποδεχθείτε τις επιλογές σας.
- Στο διακομιστήViewμενού, κάντε κλικ στο κουμπίΕργαλειοθήκη, και στη συνέχεια σύρετε μιαΚουμπίΈλεγχος σε Φόρμα1.
- Διπλό κλικButton1. Εμφανίζεται το παράθυρο κώδικα της φόρμας.
- Προσθέστε τον ακόλουθο κώδικα στην κορυφή της Form1.vb:
Imports Microsoft.Office.Interop
- Αντικαταστήστε τον ακόλουθο κώδικα στο παράθυρο κώδικα
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
- Πατήστε F5 για να εκτελέσετε την εφαρμογή.
- Ανοίξτε τη Διαχείριση εργασιών των Windows. Στο Visual Studio, εμφανίστε το παράθυρο "Έξοδος" για να δείτε τα μηνύματα εντοπισμού σφαλμάτων. Κάντε κλικ στο κουμπί εντολής και Σημειώστε ότι εμφανίζεται μια παρουσία του Excel.exe στο στοΔιαδικασίεςΛίστα (List).
- Την περίοδο λειτουργίας του Excel εξακολουθεί να εκτελείται στη λίστα εργασιών ακόμη και μετά την ολοκλήρωση της εφαρμογής σε κατάσταση αναστολής λειτουργίας. Close the dialog box and note that
Excel no longer appears in theΔιαδικασίεςΛίστα (List).
- 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 the
NAR()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 the
GC.Collect()η μέθοδος και το
GC.WaitForPendingFinalizers()method after you release the last object. Because the runtime
performs garbage collection on the RCW, the
GC.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.