Sümptomid
Kui automatiseerite Microsoft Office Microsoft Visual Basic .NET-ist või Microsoft Visual C# .NET-ist, ei välju Office rakendus sulgemismeetodile helistamisel.
Põhjus
Kui Visual Studio .NET kutsub hallatavast koodist COM-objekti, loob see automaatselt Runtime Callable Wrapperi (RCW). RCW ðerifid helistavad .NET-i rakenduse ja COM-objekti vahel. RCW säilitab COM-objektil viitenumbri. Seega, kui kõik viited pole RCW-s välja antud, ei sulgu COM-objekt.
Lahendus
Veendumaks, et Office väljub, tehke kindlaks, kas teie automatiseerimiskood vastab järgmistele kriteeriumidele.
-
Deklareerige iga objekt uue muutujana. Näiteks muutke järgmist koodirida.
oBook = oExcel.Workbooks.Add()
Muutke see järgmiselt.
dim oBooks as Excel.Workbooks oBooks = oExcel.Workbooks oBook = oBooks.Add()
-
Kui olete objekti kasutamise lõpetanud, kasutage tsükkel funktsiooni System.Runtime.InteropServices.Marshal.ReleaseComObject, kuni see tagastab väärtuse 0. System.Runtime.InteropServices.Marshal.ReleaseComObject eemaldab RCW viitenumbri ja tsükkel tagab, et aluseks olev COM-komponent vabastatakse sõltumata sellest, mitu korda see CLR-i uuesti sisestas.
-
Muutuja viite vabastamiseks määrake muutuja väärtuseks Ei midagi ega tühiväärtust.
-
Kasutage objekti Office sulgemismeetodit, et server sulgeda.
Olek
Selline käitumine on ette nähtud.
Lisateave
Käitumise taasesitamine
-
Käivitage Visual Studio .NET.
-
Klõpsake menüü Fail käsku Uus ja seejärel nuppu Project. Valige Visual Basic Projektid Windows Rakendus ja seejärel klõpsake nuppu OK.
Märkus Form1 luuakse vaikimisi. -
Lisage viide Microsoft Excel teegile. Selleks toimige järgmiselt.
-
Klõpsake Project käsku Lisa viide.
-
Otsige vahekaardil COM üles Excel objektiteek.
Microsoft Excel 2002: Microsoft Excel 10.0 Object LibraryNote
Kui te pole seda veel teinud, soovitame alla laadida ja installida Microsoft Office XP primaarsed interop-komplektid (PIA-d).
Xp pii-Office kohta lisateabe saamiseks külastage järgmist Microsofti teabebaasi (Knowledge Base) artiklit:328912 Microsoft Office XP esmased interop-komplektid (PIA-d) on allalaadimiseks saadaval
2003 Microsoft Office Excel: Microsoft Excel 11.0 Object Library -
Valikute aktsepteerimiseks klõpsake dialoogiboksis Viidete lisamine nuppu OK.
-
-
Klõpsake menüüs Vaade nuppu Tööriistakast ja seejärel lohistage nupu juhtelement vormile Form1.
-
Topeltklõpsake nuppu Button1.
Märkus Kuvatakse vormi koodiaken. -
Lisage form1.vb ülaserva järgmine kood:
Imports Microsoft.Office.Interop
-
Asendage koodiaknas järgmine kood:
Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click End Sub
Asendage järgmine kood:
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
-
Rakenduse käivitamiseks vajutage klahvi F5.
-
Avage Windows Tegumihaldur. Kui Visual Studio, kuvage silumissõnumite kuvamiseks aken Väljund. Klõpsake käsunuppu. Pange tähele, et Excel.exe kuvatakse loendis Protsessid.
-
Excel käivitatakse ülesandeloendis ka pärast seda, kui rakendus on uneaja lõpetanud. Sulgege dialoogiboks ja pange tähele, Excel ei ole enam loendis Protsessid.
-
Kui teete jaotises "Eraldusvõime" toodud juhiseid, Office rakendus pärast viimase muutuja vabastamist. Asendage funktsioon 5. juhises järgmise koodi abil.
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
Kui kasutate Visual C# .NET-i, siis viide funktsiooni NAR() koodile.
private void NAR(object o)
{
try
{
while (System.Runtime.InteropServices.Marshal.ReleaseComObject(o) > 0) ;
}
catch {}
finally
{
o = null;
}
}
Märkus. Alates .NET raamistik 2.0-st saate sama tulemuse saavutamiseks kasutada system.Runtime.InteropServices.Marshal.FinalReleaseComObjecti, mitte seda, kui helistate loopimisel system.Runtime.InteropServices.Marshal.ReleaseComObject.
Tõrkeotsing
Märkus. Kui järgite jaotises "Käitumise reprodutseerimise juhised" kirjeldatud juhiseid ja server ei sulgu endiselt, saate kasutada GC-d. Collect() meetod ja GC. WaitForPendingFinalizers() meetod pärast viimase objekti vabastamist. Kuna käitusaeg täidab RCW-s rämpsfailide kogumist, teeb GC. Collect() meetod sunnib prügikogujat käitama ja võib vabastada RCW-le alles salvestatud viited. The GC. Collect() meetod proovib saadaolevat maksimaalset mälumahtu tagasi nõuda. Pange tähele, et see ei taga, et kogu mälu taastatakse.
Kehtib:
See artikkel kehtib ka järgmiste toodete kohta:
-
Microsoft Visual Basic .NET (kõik versioonid)
-
Microsoft Visual C# .NET (kõik versioonid)
-
Microsoft Office 2016 (kõik versioonid)
-
Microsoft Office 2013 (kõik versioonid)