Käytetään kohteeseen
Visual Studio 2015

Katso muut tuotteet, joita tämä artikkeli koskee.

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

  1. Käynnistä Visual Studio .NET.

  2. Valitse Tiedosto-valikossa Uusi ja valitse sitten Project. Valitse Visual Basic-kohdassa Windows sovellus ja valitse sitten OK.Huomautus Lomake1 luodaan oletusarvoisesti.

  3. Lisää viittaus Microsoft Excel objektikirjastoon. Voit tehdä tämän seuraavasti:

    1. Valitse Project-valikossa Lisää viite.

    2. 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

    3. Hyväksy valinnat valitsemalla Lisää viittauksia -valintaikkunassa OK.

  4. Valitse Näytä-valikossa Työkaluryhmä ja vedä sitten Painike-ohjausobjekti Lomake1:lle.

  5. Kaksoisnapsauta Painiketta1.Huomautus Lomakkeen koodi-ikkuna tulee näkyviin.

  6. Lisää seuraava koodi Form1.vb-sivun alkuun:

    Imports Microsoft.Office.Interop
    
  7. 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
    
  8. Suorita sovellus painamalla F5-näppäintä.

  9. 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.

  10. 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.

  11. 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)

Tarvitsetko lisäohjeita?

Haluatko lisää vaihtoehtoja?

Tutustu tilausetuihin, selaa harjoituskursseja, opi suojaamaan laitteesi ja paljon muuta.