Oireet
Kun automatisoit Microsoft Office Microsoft Visual Basic .NET:stä tai Microsoft Visual C# .NET:stä, Office-sovellus ei poistu, kun lopetat puhelun.
Syy
Kun Visual Studio .NET kutsuu COM-objektia hallitun koodin avulla, se luo automaattisesti Runtime Callable Wrapper (RCW) -wrapperin. RCW Marshals soittaa .NET-sovelluksen ja COM-objektin välillä. RCW säilyttää viittausten määrän COM-objektissa. Jos kaikkia viittauksia ei ole julkaistu RCW:ssä, COM-objekti ei poistu.
Ratkaisu
Voit varmistaa, että Office poistuu, tarkistamalla, täyttääkö automaatiokoodi seuraavat ehdot:
-
Määritä kukin objekti uudella muuttujalla. Muuta esimerkiksi seuraavaa koodiriviä:
oBook = oExcel.Workbooks.Add()
Muuta tämä seuraavasti:
dim oBooks as Excel.Workbooks oBooks = oExcel.Workbooks oBook = oBooks.Add()
-
Käytä System.Runtime.InteropServices.Marshal.ReleaseComObject-funktiota silmukassa, kunnes se palauttaa arvon 0, kun olet lopettanut objektin käytön. The System.Runtime.InteropServices.Marshal.ReleaseComObject decrements the reference count of the RCW, and the loop makes sure that the underlying COM component is released regardless of how monta times it has re-entered the CLR.
-
Jos haluat vapauttaa muuttujan viittauksen, määritä muuttujan arvoksi Ei mitään tai Tyhjäarvo.
-
Pyydä palvelinta Office sulkemismenetelmällä.
Tila
Tämä tapahtuu oletusarvoisesti.
Lisätietoja
Toimintavaiheet uudelleen
-
Käynnistä Visual Studio .NET.
-
Valitse Tiedosto-valikossa Uusi ja valitse sitten Project. Valitse Visual Basic-kohdassa Windows sovellus ja valitse sitten OK.
Huomautus Lomake1 luodaan oletusarvoisesti. -
Lisää viittaus Microsoft Excel objektikirjastoon. Voit tehdä tämän seuraavasti:
-
Valitse Project-valikossa Lisää viite.
-
Etsi COM-välilehdessä kohdekirjaston Excel ja valitse sitten Valitse.
Microsoft Excel 2002: Microsoft Excel 10.0 Object LibraryNote
Jos et ole jo tehnyt sitä, suosittelemme, että lataat ja asennat Microsoft Office XP:n ensisijaiset interop-kokoonpanot (PIAs).
Lisätietoja XP-Office on seuraavassa Microsoft Knowledge Base -tietokannan artikkelissa:328912 Microsoft Office XP:n ensisijaiset risteyskokoonpanot (PIAs) ovat ladattavissa
For Microsoft Office Excel 2003: Microsoft Excel 11.0 Object Library -
Hyväksy valinnat valitsemalla Lisää viittauksia -valintaikkunassa OK.
-
-
Valitse Näytä-valikossa Työkaluryhmä ja vedä sitten Painike-ohjausobjekti Lomake1:lle.
-
Kaksoisnapsauta Painiketta1.
Huomautus Lomakkeen koodi-ikkuna tulee näkyviin. -
Lisää seuraava koodi Form1.vb-sivun alkuun:
Imports Microsoft.Office.Interop
-
Korvaa koodi-ikkunassa seuraava koodi:
Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click End Sub
Vaihda seuraava koodi:
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
-
Suorita sovellus painamalla F5-näppäintä.
-
Avaa Windows Tehtävienhallinta. Tuo Visual Studio näkyviin Tulostus-ikkuna, jotta näet virheenkorjausviestit. Napsauta komentopainiketta. Huomaa, että Excel.exe näkyy Prosessit-luettelossa.
-
Tehtävän esiintymä Excel edelleen tehtäväluettelossa, vaikka sovellus olisi lopettanut unisyistä. Sulje valintaikkuna ja huomaa, Excel ei enää näy Prosessit-luettelossa.
-
Kun teet Ratkaisu-osion vaiheet, Office poistuu, kun se on vapauttanut viimeisen muuttujan. Korvaa vaiheen 5 funktio seuraavalla koodilla:
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
Jos käytössäsi on Visual C# .NET, viittaa NAR()-funktion koodiin:
private void NAR(object o)
{
try
{
while (System.Runtime.InteropServices.Marshal.ReleaseComObject(o) > 0) ;
}
catch {}
finally
{
o = null;
}
}
Huomautus .NET Framework 2.0-versiosta alkaen voit käyttää System.Runtime.InteropServices.Marshal.FinalReleaseComObject-funktiota sen sijaan, että käyt silmukkapuheluita System.Runtime.InteropServices.Marshal.ReleaseComObject saman tuloksen saavuttamiseksi.
Vianmääritys
Huomautus Jos noudatat ohjeita, jotka on kuvattu "Toimintavaiheet uudelleen" -osassa, eikä palvelin vieläkään sammu, voit käyttää GC:tä. Collect()-menetelmä ja GC. WaitForPendingFinalizers() -menetelmä viimeisen objektin julkaisun jälkeen. Runtime suorittaa roskakorikokoelman RCW:ssä, eli GC:ssä. Collect()-menetelmä pakottaa roskakorin keräystyökalun toimimaan ja saattaa vapauttaa KAIKKI RCW:n viittaukset. The GC. Collect()-menetelmä yrittää ottaa käyttöön suurimman käytettävissä olevan muistin. Huomaa, että tämä ei takaa, että kaikki muisti voidaan ottaa uudelleen käyttöön.
Koskee seuraavia:
Tämä artikkeli koskee myös seuraavia:
-
Microsoft Visual Basic .NET (kaikki versiot)
-
Microsoft Visual C# .NET (kaikki versiot)
-
Microsoft Office 2016 (kaikki versiot)
-
Microsoft Office 2013 (kaikki versiot)