Pierakstīties, izmantojot Microsoft
Pierakstīties vai izveidot kontu
Sveicināti!
Atlasīt citu kontu.
Jums ir vairāki konti
Izvēlieties kontu, ar kuru vēlaties pierakstīties.

Skatiet citus produktus, uz kuriem attiecas šis raksts.

Simptomi

Ja automatizētu kādu Microsoft Office no Microsoft Visual Basic .NET vai Microsoft Visual C# .NET, Office programma netiek aizvērta, kad tiek izsaukta aizvēršanas metode.

Cēlonis

Ja Visual Studio .NET izsauc com objektu no pārvaldītā koda, tas automātiski izveido izpildlaika remarkas aplauzumu (RCW). RCW zvana starp .NET lietojumprogrammu un COM objektu. RCW saglabā atsauču skaitu COM objektā. Tāpēc, ja visas atsauces nav izlaistas RCW, COM objekts netiek aizvērts.

Risinājums

Lai pārliecinātos, vai Office programma tiek aizvērta, nosakiet, vai jūsu automatizācijas kods atbilst šādiem kritērijiem:

  • Norādiet, ka katrs objekts ir jauns mainīgais. Piemēram, mainiet tālāk norādīto koda rindiņu.

    oBook = oExcel.Workbooks.Add()
    

    Mainiet šo iestatījumu šādi:

    dim oBooks as Excel.Workbooks
    oBooks = oExcel.Workbooks
    oBook = oBooks.Add()
    
  • Izmantojiet System.Runtime.InteropServices.Loopal.ReleaseComObject cilpā, līdz tā atgriež vērtību 0, kad esat pabeidzis izmantot objektu. System.Runtime.InteropServices.Rcal.ReleaseComObject samazinās RCW atsauču skaitu, un cilpa nodrošina, ka pamatā esošais COM komponents tiek izlaists neatkarīgi no tā, cik reižu tas atkārtoti ievadījis CLR.

  • Lai izlaistu atsauci uz mainīgo, iestatiet mainīgo, kas ir vienāds ar Nekas vai Null.

  • Izmantojiet lietojumprogrammas Office objekta aizvēršanu.

Statuss

Šāda darbība ir pēc noklusējuma.

Papildinformācija

Darbības darbības darbības, kas jāveic, lai atveidotu darbību

  1. Startējiet Visual Studio .NET.

  2. Izvēlnē Fails noklikšķiniet uz Jauns un pēc tam noklikšķiniet uz Project. Sadaļā Visual Basic atlasiet Lietojumprogramma Windows pēc tam noklikšķiniet uz Labi.

    Piezīme Veidlapa1 tiek izveidota pēc noklusējuma.

  3. Pievienojiet atsauci uz Microsoft Excel objektu bibliotēku. Lai to izdarītu, veiciet tālāk norādītās darbības.

    1. Izvēlnē Project Pievienot atsauci.

    2. Cilnē COM atrodiet dokumentu objektu bibliotēku un Excel tam noklikšķiniet uz Atlasīt.

      Operētājsistēmai Microsoft Excel 2002: Microsoft Excel 10.0 Object LibraryNote

      Ja tas vēl nav izdarīts, ieteicams lejupielādēt un instalēt Microsoft Office XP primāros krustoļus (Primary Interop Assemblies — PIAs).

      Lai iegūtu papildinformāciju Office XP PIAs, skatiet šo Microsoft zināšanu bāzes rakstu:

      328912 Microsoft Office lejupielādei ir pieejami xp primārie krusto datu komplekti (PIAS).
        Microsoft Office Excel 2003: Microsoft Excel 11.0 objektu bibliotēka

    3. Dialoglodziņā Atsauču pievienošana noklikšķiniet uz Labi, lai akceptētu atlasi.

  4. Izvēlnē Skats noklikšķiniet uz Rīklodziņš un pēc tam velciet pogas vadīklu uz Forma1.

  5. Veiciet dubultklikšķi uz Poga1.

    Piezīme Tiek atvērts formas koda logs.

  6. Formas1.vb augšdaļā pievienojiet šādu kodu:

    Imports Microsoft.Office.Interop
    
  7. Koda logā aizstājiet šādu kodu:

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

    Aizstājiet ar šādu kodu:

    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. Nospiediet taustiņu F5, lai palaistu lietojumprogrammu.

  9. Atveriet Windows pārvaldnieku. Lai Visual Studio atkļūdošanas ziņojumus, šajā logā atveriet logu Izvade. Noklikšķiniet uz komandpogas. Ņemiet vērā, ka Excel.exe instance tiek parādīta sarakstā Procesi.

  10. Lietojumprogrammas Excel joprojām darbojas uzdevumu sarakstā pat pēc tam, kad programma ir guļoša. Aizveriet dialoglodziņu un ievērojiet, Excel tie vairs netiek rādīti sarakstā Procesi.

  11. Veicot darbības sadaļā "Izšķirtspēja", programma Office iziet pēc pēdējā mainīgā izlaišanas. Aizstājiet funkciju 5. darbībā, izmantojot šādu kodu:

      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
    

Ja izmantojat Visual C# .NET, atsauce uz funkcijas NAR() kodu:

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

Piezīme. Sākot no .NET Framework 2.0, varat izmantot System.Runtime.InteropServices.Loopal.FinalReleaseComObject, nevis cilpu, zvanot System.Runtime.InteropServices.Loopal.ReleaseComObject, lai iegūtu to pašu rezultātu.
 

Problēmu novēršana

Piezīme. Ja izpildīsit darbības, kas aprakstītas sadaļā "Darbības, lai atveidotu darbību", bet serveris joprojām netiek izslēgts, varat izmantot GC. Collect() metode un GC. Metode WaitForPendingFinalizers() pēc pēdējā objekta izlaišanas. Tā kā izpildlaiks veic atkritumu vākšanu RCW, GC. Collect() metode liek izmantot atkritumu uzbērumu un var izlaist visas RCW joprojām izmantotās atsauces. The GC. Collect() metode mēģina atgūt maksimālo pieejamo atmiņu. Ievērojiet, ka tas negarantē, ka visa atmiņa tiks atgūta.

Attiecas uz:

Šis raksts attiecas arī uz:

  • Microsoft Visual Basic .NET (visi izdevumi)

  • Microsoft Visual C# .NET (visi izdevumi)

  • Microsoft Office 2016 (visi izdevumi)

  • Microsoft Office 2013 (visi izdevumi)

Nepieciešama papildu palīdzība?

Vēlaties vairāk opciju?

Izpētiet abonementa priekšrocības, pārlūkojiet apmācības kursus, uzziniet, kā aizsargāt ierīci un veikt citas darbības.

Kopienas palīdz uzdot jautājumus un atbildēt uz tiem, sniegt atsauksmes, kā arī saņemt informāciju no ekspertiem ar bagātīgām zināšanām.

Vai šī informācija bija noderīga?

Cik lielā mērā esat apmierināts ar valodas kvalitāti?
Kas ietekmēja jūsu pieredzi?
Nospiežot Iesniegt, jūsu atsauksmes tiks izmantotas Microsoft produktu un pakalpojumu uzlabošanai. Jūsu IT administrators varēs vākt šos datus. Paziņojums par konfidencialitāti.

Paldies par jūsu atsauksmēm!

×