Prisijunkite prie „Microsoft“
Prisijunkite arba sukurkite paskyrą.
Sveiki,
Pasirinkti kitą paskyrą.
Turite kelias paskyras
Pasirinkite paskyrą, kurią naudodami norite prisijungti.

Peržiūrėkite kitus produktus, kuriems taikomas šis straipsnis.

Simptomai

Kai automatizuoti Microsoft Office "Microsoft Visual Basic.NET" arba "Microsoft Visual C# .NET", "Office" taikomoji programa neišeis, kai skambinate į metodą Baigti.

Priežastis

Kai Visual Studio .NET iš valdomo kodo skambina COM objektu, jis automatiškai sukuria "Runtime Callable Wrapper" (RCW). RCW maršalai skambina tarp .NET taikomosios programos ir COM objekto. RCW išlaiko COM objekto nuorodų skaičių. Todėl, jei visos nuorodos nebuvo išleistos RCW, COM objektas neišeis.

Sprendimas

Norėdami įsitikinti, kad Office programa išeina, nustatykite, ar jūsų automatizavimo kodas atitinka šiuos kriterijus:

  • Kiekvieną objektą paskelbti nauju kintamuoju. Pvz., pakeiskite šią kodo eilutę:

    oBook = oExcel.Workbooks.Add()
    

    Pakeiskite į šį:

    dim oBooks as Excel.Workbooks
    oBooks = oExcel.Workbooks
    oBook = oBooks.Add()
    
  • Naudokite System.Runtime.InteropServices.Marshal.ReleaseComObject cikle, kol grąžins 0, kai baigsite naudoti objektą. System.Runtime.InteropServices.Marshal.ReleaseComObject išleidžia RCW nuorodų skaičių, o ciklas užtikrina, kad esantis COM komponentas bus išleistas neatsižvelgiant į tai, kiek kartų jis iš naujo įvedė CLR.

  • Norėdami paleisti nuorodą į kintamąjį, nustatykite kintamąjį, lygų Nieko arba Null.

  • Naudokite programos objekto Office metodą Baigti, kad nurodykite serveriui išjungti.

Būsena

Taip yra pagal dizainą.

Daugiau informacijos

Veiksmai, kaip atkurti veikimą

  1. Paleiskite Visual Studio .NET.

  2. Meniu Failas spustelėkite Naujas, tada spustelėkite Project. Dalyje Visual Basic Projektai pasirinkite Windows, tada spustelėkite Gerai.

    Pastaba Forma1 sukuriama pagal numatytuosius nustatymus.

  3. Įtraukite nuorodą į Microsoft Excel biblioteką. Norėdami tai atlikti, vykdykite toliau nurodytus veiksmus.

    1. Meniu Project spustelėkite Įtraukti nuorodą.

    2. Skirtuke COM raskite objekto biblioteką, Excel pasirinkite.

      "Microsoft Excel 2002": "Microsoft Excel 10.0 Object LibraryNote

      " Jei to dar nepadarėte, rekomenduojame atsisiųsti ir įdiegti "Microsoft Office XP" pirminius tarpinių mazgų rinkinius (PIAS).

      Daugiau informacijos apie Office XP PIAs" rasite šiame "Microsoft" žinių bazės straipsnyje:

      328912 Microsoft Office XP" pirminius tarpinių mazgų rinkinius (PIAs) galima atsisiųsti
        Jei Microsoft Office Excel 2003": Microsoft Excel 11.0 objektų biblioteka

    3. Spustelėkite Gerai dialogo lange Įtraukti nuorodas, kad sutikite su savo pasirinkimais.

  4. Meniu Rodymas spustelėkite Įrankių komplektas, tada vilkite mygtuko valdiklį į Form1.

  5. Dukart spustelėkite Button1.

    Pastaba Rodomas formos kodo langas.

  6. Formos1.vb viršuje įtraukite šį kodą:

    Imports Microsoft.Office.Interop
    
  7. Kodo lange pakeiskite šį kodą:

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

    Pakeiskite šį 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. Paspauskite F5, kad paleisite taikomąją programą.

  9. Atidarykite Windows užduočių tvarkytuvą. Lange Visual Studio langą Išvestis, kad pamatytumėte derinimo pranešimus. Spustelėkite komandos mygtuką. Atkreipkite dėmesį, kad Excel.exe rodomas sąraše Procesai.

  10. Užduočių Excel vis dar veikia užduočių sąraše net tada, kai taikomoji programa baigia miegoti. Uždarykite dialogo langą ir atkreipkite dėmesį Excel neberodoma sąraše Procesai.

  11. Kai atlikite veiksmus, nurodytus skyriuje "Sprendimas", Office programa išeis, kai ji išleis paskutinį kintamąjį. Pakeiskite funkciją atlikdami 5 veiksmą naudodami šį kodą:

      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
    

Jei naudojate "Visual C# .NET", nurodyti FUNKCIJOS NAR() kodą:

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

Pastaba Pradedant nuo .NET Framework 2.0, galite naudoti System.Runtime.InteropServices.Marshal.FinalReleaseComObject, o ne ciklą skambinti System.Runtime.InteropServices.Marshal.ReleaseComObject, kad pasiektume tą patį rezultatą.
 

Trikčių šalinimas

Pastaba Jei atlikite veiksmus, aprašytus skyriuje "Veikimo atkūrimo veiksmai", o serveris vis tiek neišsijungia, galite naudoti GC. Collect() metodas ir GC. WaitForPendingFinalizers() metodas, kai atleisite paskutinį objektą. Kadangi vykdyklė atlieka šiukšlių rinkinį RCW, GC. Collect() metodas verčia šiukšlių rinktuvą veikti ir gali išleisti visas nuorodas, kurias vis dar turi RCW. The GC. Collect() metodas bando susigrąžinti maksimalią prieinamą atmintį. Atkreipkite dėmesį, kad tai negarantuoja, kad visa atmintis bus atlaisvinta.

Taikoma

Šis straipsnis taip pat taikomas:

  • "Microsoft Visual Basic.NET" (visi leidimai)

  • Microsoft Visual C# .NET (visi leidimai)

  • Microsoft Office 2016 (visi leidimai)

  • Microsoft Office 2013 m. (visi leidimai)

Reikia daugiau pagalbos?

Norite daugiau parinkčių?

Sužinokite apie prenumeratos pranašumus, peržiūrėkite mokymo kursus, sužinokite, kaip apsaugoti savo įrenginį ir kt.

Bendruomenės padeda užduoti klausimus ir į juos atsakyti, pateikti atsiliepimų ir išgirsti iš ekspertų, turinčių daug žinių.

Ar ši informacija buvo naudinga?

Ar esate patenkinti kalbos kokybe?
Kas turėjo įtakos jūsų įspūdžiams?
Paspaudus mygtuką Pateikti, jūsų atsiliepimai bus naudojami tobulinant „Microsoft“ produktus ir paslaugas. Jūsų IT administratorius galės rinkti šiuos duomenis. Privatumo patvirtinimas.

Dėkojame už jūsų atsiliepimą!

×