Applies ToVisual Studio 2015

Pogledajte druge proizvode na koje se ovaj članak odnosi.

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

  1. Pokrenite Visual Studio .NET.

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

  3. Dodajte referencu u biblioteku Microsoft Excel objekta. Da biste to učinili, slijedite ove korake:

    1. Na izborniku Project kliknite Dodaj referencu.

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

    3. Kliknite U redu u dijaloškom okviru Dodavanje referenci da biste prihvaćali odabire.

  4. Na izborniku Prikaz kliknite Alatni okvir, a zatim povucite kontrolu gumba na Obrazac1.

  5. Dvokliknite Gumb1.Napomena Prikazat će se prozor koda za obrazac.

  6. Pri vrhu obrasca1.vb dodajte sljedeći kod:

    Imports Microsoft.Office.Interop
    
  7. 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
    
  8. Pritisnite F5 da biste pokrenuti aplikaciju.

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

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

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

Potrebna vam je dodatna pomoć?

Želite dodatne mogućnosti?

Istražite pogodnosti pretplate, pregledajte tečajeve za obuku, saznajte kako zaštititi uređaj i još mnogo toga.

Zajednice vam pomažu da postavljate pitanja i odgovarate na njih, pošaljete povratne informacije i čujete se sa stručnjacima s bogatim znanjem.