Pogledajte ostale proizvode na koje se ovaj članak odnosi.

Simptomi

Kada automatizujete aplikaciju Microsoft kancelarija microsoft Visual Basic .NET ili Microsoft Visual C# .NET, Kancelarija aplikacija se ne napušta kada pozovete metod Odustani.

Uzrok

Kada Visual Studio .NET poziva COM objekat iz kontrolisanog koda, on automatski kreira Runtime Callable Wrapper (RCW). RCW poziva pozive između aplikacije .NET i COM objekta. RCW čuva broj referenci na COM objekat. Stoga, ako sve reference nisu objavljene na RCW, COM objekat se ne odustaje.

Rezolucija

Da biste bili sigurni da Kancelarija aplikacija izađe, utvrdite da li kôd za automatizaciju ispunjava sledeće kriterijume:

  • Deklarišite svaki objekat kao novu promenljivu. Na primer, promenite sledeći red koda:

    oBook = oExcel.Workbooks.Add()
    

    Promenite ovo na sledeći način:

    dim oBooks as Excel.Workbooks
    oBooks = oExcel.Workbooks
    oBook = oBooks.Add()
    
  • Koristite System.Runtime.InteropServices.ReleaseComObject u petlji dok ne vrati 0 kada završite sa korišćenjem objekta. System.Runtime.InteropServices.Lou.ReleaseComObject smanjuje broj referenci za RCW, a petlja vodi računa da se opadajućoj komponenti COM objavljuje bez obzira na to koliko puta je ponovo unela CLR.

  • Da biste izdali referencu na promenljivu, postavite promenljivu jednaku "Ništa" ili "Null".

  • Koristite metod Napuštanje objekta Kancelarija da biste serveru rekli da ga isključi.

Status

Ovo ponašanje je takvo s dizajnom.

Više informacija

Koraci za reprodukovano ponašanje

  1. Pokrenite Visual Studio .NET.

  2. U meniju Datoteka izaberite stavku Novo, a zatim izaberite stavku Project. U Visual Basic Projekti izaberite stavku Windows, a zatim kliknite na dugme U redu.

    Napomišite Obrazac1 se podrazumevano kreira.

  3. Dodajte referencu na biblioteku Microsoft Excel objekata. Da biste to uradio, sledite ove korake:

    1. U meniju Project izaberite stavku Dodaj referencu.

    2. Na kartici COM pronađite biblioteku objekata na Excel zatim kliknite na dugme Izaberi.

      Za Microsoft Excel 2002: Microsoft Excel 10.0 Biblioteka

      objekataNote Ako to već niste uradili, preporučujemo da preuzmete i instalirate Microsoft kancelarija XP primarne asemblije (PIA-e).

      Dodatne informacije o Kancelarija XP PIA-ovima potražite u sledećem članku Microsoft baze znanja:

      328912 Microsoft kancelarija XP primarne instalacije (PIA-i) dostupne su za preuzimanje
        Za Microsoft kancelarija Excel 2003: Microsoft Excel 11.0 biblioteka objekata

    3. Kliknite na dugme U redu u dijalogu Dodavanje referenci da biste prihvatili izbore.

  4. U meniju Prikaz izaberite stavku Okvir sa alatkama, a zatim prevucite kontrolu dugmeta u obrazac1.

  5. Kliknite dvaput na dugme1.

    Napomišite Pojavljuje se prozor sa kodom za obrazac.

  6. Dodajte sledeći kôd na vrh obrasca1.vb:

    Imports Microsoft.Office.Interop
    
  7. Zamenite sledeći kôd u prozoru koda:

        Private Sub Button1_Click(ByVal sender As System.Object, _
           ByVal e As System.EventArgs) Handles Button1.Click
        End Sub
    

    Zamenite sledeći kôd:

    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 taster F5 da biste pokrenuti aplikaciju.

  9. Otvorite Windows zadataka. U Visual Studio prikažite prozor Izlaz da biste videli poruke o otklanjaju grešaka. Kliknite na komandno dugme. Primetićete da se instanca Excel.exe pojavljuje na listi Procesi.

  10. Instanca ovog Excel pokreće na listi zadataka čak i kada aplikacija završi sa spavanjeem. Zatvorite dijalog i obratite pažnju Excel se više ne pojavljuje na listi Procesi.

  11. Kada uradite korake u odeljku "Rezolucija", Kancelarija aplikacija izlazi pošto objavi poslednju promenljivu. Zamenite funkciju u 5. koraku koristeći sledeći kôd:

      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, referenca na kôd za funkciju NAR():

private void NAR(object o)
{
    try 
    {
        while (System.Runtime.InteropServices.Marshal.ReleaseComObject(o) > 0) ;
    }
    catch {}
    finally 
    {
        o = null;
    }
}

Na umu Počevši od .NET Framework 2.0, možete da koristite System.Runtime.InteropServices.Calling.FinalReleaseComObject umesto da istovremeno pozivate System.Runtime.InteropServices.Release.ReleaseComObject da biste postigli isti rezultat.
 

Rešavanje problema

Napomišite Ako pratite korake opisane u odeljku "Koraci za reprodukovano ponašanje", a server se i dalje ne zatvara, možete da koristite GC. Metod Prikupljanje() i GC. Metod WaitForPendingFinalizers() kada otpustite poslednji objekat. Zbog toga što vreme izvršavanja obavlja kolekciju smeća na sajtu RCW, GC. Metod prikupljanja() primora prikupljanje smeća da pokrene i može da izda reference koje RCW i dalje ima. The GC. Metod prikupljanja() pokušava da povrati maksimalnu dostupnu memoriju. Obratite pažnju na to da ovo ne garantuje da će sva memorija biti povraćaj.

Odnosi se na

Ovaj članak se takođe odnosi na:

  • Microsoft Visual Basic .NET (sva izdanja)

  • Microsoft Visual C# .NET (sva izdanja)

  • Microsoft kancelarija 2016 (sva izdanja)

  • Microsoft kancelarija 2013 (sva izdanja)

Da li vam je potrebna dodatna pomoć?

Unapredite veštine

Istražite obuku >

Prvi nabavite nove funkcije

Pridružite se Microsoft insajdere >

Da li su vam ove informacije koristile?

Koliko ste zadovoljni kvalitetom jezika?
Šta je uticalo na vaše iskustvo?

Hvala vam na povratnim informacijama!

×