Simptomi
Ja automatizētu kādu Microsoft Office no Microsoft Visual Basic .NET vai Microsoft Visual C# .NET, Office programma netiek aizvērta, kad tiek izsaukta aizvēršanas metode.
Cēlonis
Ja Visual Studio .NET izsauc com objektu no pārvaldītā koda, tas automātiski izveido izpildlaika remarkas aplauzumu (RCW). RCW zvana starp .NET lietojumprogrammu un COM objektu. RCW saglabā atsauču skaitu COM objektā. Tāpēc, ja visas atsauces nav izlaistas RCW, COM objekts netiek aizvērts.
Risinājums
Lai pārliecinātos, vai Office programma tiek aizvērta, nosakiet, vai jūsu automatizācijas kods atbilst šādiem kritērijiem:
-
Norādiet, ka katrs objekts ir jauns mainīgais. Piemēram, mainiet tālāk norādīto koda rindiņu.
oBook = oExcel.Workbooks.Add()
Mainiet šo iestatījumu šādi:
dim oBooks as Excel.Workbooks oBooks = oExcel.Workbooks oBook = oBooks.Add()
-
Izmantojiet System.Runtime.InteropServices.Loopal.ReleaseComObject cilpā, līdz tā atgriež vērtību 0, kad esat pabeidzis izmantot objektu. System.Runtime.InteropServices.Rcal.ReleaseComObject samazinās RCW atsauču skaitu, un cilpa nodrošina, ka pamatā esošais COM komponents tiek izlaists neatkarīgi no tā, cik reižu tas atkārtoti ievadījis CLR.
-
Lai izlaistu atsauci uz mainīgo, iestatiet mainīgo, kas ir vienāds ar Nekas vai Null.
-
Izmantojiet lietojumprogrammas Office objekta aizvēršanu.
Statuss
Šāda darbība ir pēc noklusējuma.
Papildinformācija
Darbības darbības darbības, kas jāveic, lai atveidotu darbību
-
Startējiet Visual Studio .NET.
-
Izvēlnē Fails noklikšķiniet uz Jauns un pēc tam noklikšķiniet uz Project. Sadaļā Visual Basic atlasiet Lietojumprogramma Windows pēc tam noklikšķiniet uz Labi.
Piezīme Veidlapa1 tiek izveidota pēc noklusējuma. -
Pievienojiet atsauci uz Microsoft Excel objektu bibliotēku. Lai to izdarītu, veiciet tālāk norādītās darbības.
-
Izvēlnē Project Pievienot atsauci.
-
Cilnē COM atrodiet dokumentu objektu bibliotēku un Excel tam noklikšķiniet uz Atlasīt.
Operētājsistēmai Microsoft Excel 2002: Microsoft Excel 10.0 Object LibraryNote
Ja tas vēl nav izdarīts, ieteicams lejupielādēt un instalēt Microsoft Office XP primāros krustoļus (Primary Interop Assemblies — PIAs).
Lai iegūtu papildinformāciju Office XP PIAs, skatiet šo Microsoft zināšanu bāzes rakstu:328912 Microsoft Office lejupielādei ir pieejami xp primārie krusto datu komplekti (PIAS).
Microsoft Office Excel 2003: Microsoft Excel 11.0 objektu bibliotēka -
Dialoglodziņā Atsauču pievienošana noklikšķiniet uz Labi, lai akceptētu atlasi.
-
-
Izvēlnē Skats noklikšķiniet uz Rīklodziņš un pēc tam velciet pogas vadīklu uz Forma1.
-
Veiciet dubultklikšķi uz Poga1.
Piezīme Tiek atvērts formas koda logs. -
Formas1.vb augšdaļā pievienojiet šādu kodu:
Imports Microsoft.Office.Interop
-
Koda logā aizstājiet šādu kodu:
Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click End Sub
Aizstājiet ar šādu kodu:
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
-
Nospiediet taustiņu F5, lai palaistu lietojumprogrammu.
-
Atveriet Windows pārvaldnieku. Lai Visual Studio atkļūdošanas ziņojumus, šajā logā atveriet logu Izvade. Noklikšķiniet uz komandpogas. Ņemiet vērā, ka Excel.exe instance tiek parādīta sarakstā Procesi.
-
Lietojumprogrammas Excel joprojām darbojas uzdevumu sarakstā pat pēc tam, kad programma ir guļoša. Aizveriet dialoglodziņu un ievērojiet, Excel tie vairs netiek rādīti sarakstā Procesi.
-
Veicot darbības sadaļā "Izšķirtspēja", programma Office iziet pēc pēdējā mainīgā izlaišanas. Aizstājiet funkciju 5. darbībā, izmantojot šādu kodu:
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
Ja izmantojat Visual C# .NET, atsauce uz funkcijas NAR() kodu:
private void NAR(object o)
{
try
{
while (System.Runtime.InteropServices.Marshal.ReleaseComObject(o) > 0) ;
}
catch {}
finally
{
o = null;
}
}
Piezīme. Sākot no .NET Framework 2.0, varat izmantot System.Runtime.InteropServices.Loopal.FinalReleaseComObject, nevis cilpu, zvanot System.Runtime.InteropServices.Loopal.ReleaseComObject, lai iegūtu to pašu rezultātu.
Problēmu novēršana
Piezīme. Ja izpildīsit darbības, kas aprakstītas sadaļā "Darbības, lai atveidotu darbību", bet serveris joprojām netiek izslēgts, varat izmantot GC. Collect() metode un GC. Metode WaitForPendingFinalizers() pēc pēdējā objekta izlaišanas. Tā kā izpildlaiks veic atkritumu vākšanu RCW, GC. Collect() metode liek izmantot atkritumu uzbērumu un var izlaist visas RCW joprojām izmantotās atsauces. The GC. Collect() metode mēģina atgūt maksimālo pieejamo atmiņu. Ievērojiet, ka tas negarantē, ka visa atmiņa tiks atgūta.
Attiecas uz:
Šis raksts attiecas arī uz:
-
Microsoft Visual Basic .NET (visi izdevumi)
-
Microsoft Visual C# .NET (visi izdevumi)
-
Microsoft Office 2016 (visi izdevumi)
-
Microsoft Office 2013 (visi izdevumi)