Simptomi
Kada automatizujete aplikaciju Microsoft kancelarija microsoft Visual Basic .NET ili Microsoft Visual C# .NET, Kancelarija aplikacija se ne napušta kada pozovete metod Odustani.
Uzrok
Kada Visual Studio .NET poziva COM objekat iz kontrolisanog koda, on automatski kreira Runtime Callable Wrapper (RCW). RCW poziva pozive između aplikacije .NET i COM objekta. RCW čuva broj referenci na COM objekat. Stoga, ako sve reference nisu objavljene na RCW, COM objekat se ne odustaje.
Rezolucija
Da biste bili sigurni da Kancelarija aplikacija izađe, utvrdite da li kôd za automatizaciju ispunjava sledeće kriterijume:
-
Deklarišite svaki objekat kao novu promenljivu. Na primer, promenite sledeći red koda:
oBook = oExcel.Workbooks.Add()
Promenite ovo na sledeći način:
dim oBooks as Excel.Workbooks oBooks = oExcel.Workbooks oBook = oBooks.Add()
-
Koristite System.Runtime.InteropServices.ReleaseComObject u petlji dok ne vrati 0 kada završite sa korišćenjem objekta. System.Runtime.InteropServices.Lou.ReleaseComObject smanjuje broj referenci za RCW, a petlja vodi računa da se opadajućoj komponenti COM objavljuje bez obzira na to koliko puta je ponovo unela CLR.
-
Da biste izdali referencu na promenljivu, postavite promenljivu jednaku "Ništa" ili "Null".
-
Koristite metod Napuštanje objekta Kancelarija da biste serveru rekli da ga isključi.
Status
Ovo ponašanje je takvo s dizajnom.
Više informacija
Koraci za reprodukovano ponašanje
-
Pokrenite Visual Studio .NET.
-
U meniju Datoteka izaberite stavku Novo, a zatim izaberite stavku Project. U Visual Basic Projekti izaberite stavku Windows, a zatim kliknite na dugme U redu.
Napomišite Obrazac1 se podrazumevano kreira. -
Dodajte referencu na biblioteku Microsoft Excel objekata. Da biste to uradio, sledite ove korake:
-
U meniju Project izaberite stavku Dodaj referencu.
-
Na kartici COM pronađite biblioteku objekata na Excel zatim kliknite na dugme Izaberi.
Za Microsoft Excel 2002: Microsoft Excel 10.0 Biblioteka
objekataNote Ako to već niste uradili, preporučujemo da preuzmete i instalirate Microsoft kancelarija XP primarne asemblije (PIA-e).
Dodatne informacije o Kancelarija XP PIA-ovima potražite u sledećem članku Microsoft baze znanja:328912 Microsoft kancelarija XP primarne instalacije (PIA-i) dostupne su za preuzimanje
Za Microsoft kancelarija Excel 2003: Microsoft Excel 11.0 biblioteka objekata -
Kliknite na dugme U redu u dijalogu Dodavanje referenci da biste prihvatili izbore.
-
-
U meniju Prikaz izaberite stavku Okvir sa alatkama, a zatim prevucite kontrolu dugmeta u obrazac1.
-
Kliknite dvaput na dugme1.
Napomišite Pojavljuje se prozor sa kodom za obrazac. -
Dodajte sledeći kôd na vrh obrasca1.vb:
Imports Microsoft.Office.Interop
-
Zamenite sledeći kôd u prozoru koda:
Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click End Sub
Zamenite sledeći kôd:
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
-
Pritisnite taster F5 da biste pokrenuti aplikaciju.
-
Otvorite Windows zadataka. U Visual Studio prikažite prozor Izlaz da biste videli poruke o otklanjaju grešaka. Kliknite na komandno dugme. Primetićete da se instanca Excel.exe pojavljuje na listi Procesi.
-
Instanca ovog Excel pokreće na listi zadataka čak i kada aplikacija završi sa spavanjeem. Zatvorite dijalog i obratite pažnju Excel se više ne pojavljuje na listi Procesi.
-
Kada uradite korake u odeljku "Rezolucija", Kancelarija aplikacija izlazi pošto objavi poslednju promenljivu. Zamenite funkciju u 5. koraku koristeći sledeći kôd:
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
Ako koristite Visual C# .NET, referenca na kôd za funkciju NAR():
private void NAR(object o)
{
try
{
while (System.Runtime.InteropServices.Marshal.ReleaseComObject(o) > 0) ;
}
catch {}
finally
{
o = null;
}
}
Na umu Počevši od .NET Framework 2.0, možete da koristite System.Runtime.InteropServices.Calling.FinalReleaseComObject umesto da istovremeno pozivate System.Runtime.InteropServices.Release.ReleaseComObject da biste postigli isti rezultat.
Rešavanje problema
Napomišite Ako pratite korake opisane u odeljku "Koraci za reprodukovano ponašanje", a server se i dalje ne zatvara, možete da koristite GC. Metod Prikupljanje() i GC. Metod WaitForPendingFinalizers() kada otpustite poslednji objekat. Zbog toga što vreme izvršavanja obavlja kolekciju smeća na sajtu RCW, GC. Metod prikupljanja() primora prikupljanje smeća da pokrene i može da izda reference koje RCW i dalje ima. The GC. Metod prikupljanja() pokušava da povrati maksimalnu dostupnu memoriju. Obratite pažnju na to da ovo ne garantuje da će sva memorija biti povraćaj.
Odnosi se na
Ovaj članak se takođe odnosi na:
-
Microsoft Visual Basic .NET (sva izdanja)
-
Microsoft Visual C# .NET (sva izdanja)
-
Microsoft kancelarija 2016 (sva izdanja)
-
Microsoft kancelarija 2013 (sva izdanja)