Simptomi
Kada automatizirate aplikaciju Microsoft Office microsoft Visual Basic .NET ili Microsoft Visual C# .NET, aplikacija Office ne napušta se kada pozovete metodu Quit.
Uzrok
Kada Visual Studio .NET nazove COM objekt iz upravljanog koda, automatski stvara prelomnik za pozivanje (RCW). The RCW marshalls calls between the .NET application and the COM object. RCW zadržava broj referenci na COM objektu. Stoga, ako sve reference nisu objavljene na RCW-u, COM objekt ne odustaje.
Rješenje
Da biste bili sigurni da će Office aplikacija izaći, odredite ispunjava li kod automatizacije sljedeće kriterije:
-
Deklarirati svaki objekt kao novu varijablu. Promijenite, primjerice, sljedeći redak koda:
oBook = oExcel.Workbooks.Add()
Promijenite to na sljedeće:
dim oBooks as Excel.Workbooks oBooks = oExcel.Workbooks oBook = oBooks.Add()
-
Koristite System.Runtime.InteropServices.Marshall.ReleaseComObject u petlji dok ne vrati 0 kada završite s korištenjem objekta. System.Runtime.InteropServices.Marshall.ReleaseComObject usporava broj referenci RCW-a, a petlja će osigurati da se temeljna COM komponenta objavi bez obzira na to koliko je puta ponovno unijela CLR.
-
Da biste ispostavili referencu na varijablu, postavite varijablu jednaku Ništa ili Null.
-
Pomoću metode Quit objekta aplikacije Office poslužitelju recite da se isključi.
Status
Takvo je ponašanje po dizajnu.
Dodatne informacije
Koraci za reprodukciju ponašanja
-
Pokrenite Visual Studio .NET.
-
Na izborniku Datoteka kliknite Novo, a zatim kliknite Project. U odjeljku Visual Basic Projekti odaberite Windows aplikacija, a zatim kliknite U redu.
Napomena Obrazac1 po zadanom se stvara. -
Dodajte referencu u biblioteku Microsoft Excel objekta. Da biste to učinili, slijedite ove korake:
-
Na izborniku Project kliknite Dodaj referencu.
-
Na kartici COM pronađite biblioteku objekata za Excel, a zatim kliknite Odaberi.
Za Microsoft Excel 2002: Microsoft Excel 10.0 Biblioteka objekataNote Ako to još niste učinili, preporučujemo da preuzmete i instalirate Microsoft Office XP Primary Interop Assemblies (PIAs). Dodatne informacije o Office XP pias potražite u sljedećem članku iz Microsoftove baze znanja:328912 Microsoft Office su za preuzimanje dostupne primarne sklopove međuopsežnih uređaja XP Za Microsoft Office Excel 2003: Microsoft Excel 11.0 Biblioteka objekata
-
Kliknite U redu u dijaloškom okviru Dodavanje referenci da biste prihvaćali odabire.
-
-
Na izborniku Prikaz kliknite Alatni okvir, a zatim povucite kontrolu gumba na Obrazac1.
-
Dvokliknite Gumb1.
Napomena Prikazat će se prozor koda za obrazac. -
Pri vrhu obrasca1.vb dodajte sljedeći kod:
Imports Microsoft.Office.Interop
-
U prozoru koda zamijenite sljedeći kod:
Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click End Sub
Zamijenite sljedeći kod:
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 F5 da biste pokrenuti aplikaciju.
-
Otvorite Windows Upravitelj zadataka. U Visual Studio, prikažite prozor Izlaz da biste vidjeli poruke o ispravljaju pogrešaka. Kliknite naredbeni gumb. Imajte na Excel.exe na popisu Procesi.
-
Instanca Excel i dalje se pokreće na popisu zadataka čak i nakon što aplikacija završi sa spavanjem. Zatvorite dijaloški okvir i primijetite da Excel više ne prikazuje na popisu Procesi.
-
Kada poduzmete korake u odjeljku "Razlučivost", Office će se nakon objave posljednje varijable. Zamijenite funkciju u petom koraku pomoću sljedećeg koda:
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, referencu na kod za funkciju NAR():
private void NAR(object o)
{
try
{
while (System.Runtime.InteropServices.Marshal.ReleaseComObject(o) > 0) ;
}
catch {}
finally
{
o = null;
}
}
Napomena Počevši od .NET Framework 2.0, možete koristiti System.Runtime.InteropServices.Marshall.FinalReleaseComObject umjesto nazivanja petlje System.Runtime.InteropServices.Marshall.ReleaseComObject da biste postigli isti rezultat.
Otklanjanje poteškoća
Napomena Ako slijedite korake opisane u odjeljku "Koraci za reprodukciju ponašanja", a poslužitelj se i dalje ne isključi, možete koristiti GC. Metoda Collect() i GC. Metoda WaitForPendingFinalizers() nakon što otpustite zadnji objekt. Budući da vrijeme izvođenja izvodi zbirku smeća na RCW-u, GC-u. Metoda Collect() prisiljava sakupljača smeća da se pokrene i može objaviti sve reference koje RCW još ima. The GC. Metoda Collect() pokušava vratiti maksimalnu raspoloživu memoriju. Obratite pozornost na to da to ne jamči da će se sva memorija vratiti.
Odnosi se na
Ovaj se članak odnosi i na:
-
Microsoft Visual Basic .NET (sva izdanja)
-
Microsoft Visual C# .NET (sva izdanja)
-
Microsoft Office 2016 (sva izdanja)
-
Microsoft Office 2013 (sva izdanja)