Prihláste sa s kontom Microsoft
Prihláste sa alebo si vytvorte konto.
Dobrý deň,
Vyberte iné konto.
Máte viacero kont
Vyberte konto, s ktorým sa chcete prihlásiť.

Pozrite si ďalšie produkty, na ktoré sa tento článok vzťahuje.

Príznaky

Keď automatizujete aplikáciu programu Microsoft Office z lokality Microsoft Visual Basic .NET alebo Microsoft Visual C# .NET, aplikácia Office pri volávaní metódy Quit neukonči.

Príčina

Keď Visual Studio .NET zavolá objekt COM zo spravovaného kódu, automaticky sa vytvorí zalomenie v režime Runtime Callable (RCW). Marshals RCW volá medzi aplikáciou .NET a objektom COM. V objekte RCW sa uchováva počet odkazov v objekte COM. Preto ak pre RCW neboli vydané všetky odkazy, objekt COM sa neukonči.

Riešenie

Ak sa chcete uistiť, Office vaša aplikácia zavrie, zistite, či váš automatizačný kód spĺňa nasledujúce kritériá:

  • Deklarovať každý objekt ako novú premennú. Môžete napríklad zmeniť nasledujúci riadok kódu:

    oBook = oExcel.Workbooks.Add()
    

    Zmeňte toto nastavenie na nasledujúce:

    dim oBooks as Excel.Workbooks
    oBooks = oExcel.Workbooks
    oBook = oBooks.Add()
    
  • Použite System.Runtime.InteropServices.Marshal.ReleaseComObject v slučke dovtedy, kým sa po ukončení používania objektu nevráti hodnota 0. System.Runtime.InteropServices.Marshal.ReleaseComObject decrements odkazuje na RCW a slučka zabezpečuje, že sa uvoľní základná súčasť COM bez ohľadu na to, koľkokrát sa opätovne zadala do modulu CLR.

  • Ak chcete uvoľniť odkaz na premennú, nastavte premennú na hodnotu Nothing alebo Null.

  • Použite metódu Quit objektu Office aplikácie na vypnutie servera.

Stav

Toto správanie je na základe návrhu.

Ďalšie informácie

Kroky na reprodukovať správanie

  1. Spustite Visual Studio .NET.

  2. V ponuke Súbor kliknite na položku Nový a potom kliknite na položku Project. V Visual Basic Projekty vyberte položku Windows a potom kliknite na tlačidlo OK.

    Poznámka Formulár1 sa vytvorí predvolene.

  3. Pridajte odkaz na Microsoft Excel knižnice objektov. Postupujte podľa nasledujúcich krokov:

    1. V ponuke Project kliknite na položku Pridať odkaz.

    2. Na karte COM vyhľadajte objektovú knižnicu objektov pre všetky Excel potom kliknite na položku Vybrať.

      Pre Microsoft Excel 2002: Microsoft Excel 10.0 Object LibraryNote

      Ak ste to ešte neurobili, odporúčame vám stiahnuť a nainštalovať Microsoft Office XP primárne zostavy interopcie (PIA).

      Ďalšie informácie o Office XP PIA nájdete v tomto článku vedomostnej databázy Microsoft Knowledge Base:

      328912 Microsoft Office sú k dispozícii na stiahnutie, xp hlavné zostavy spojok (PIA)
        Pre Microsoft Office Excel 2003: Microsoft Excel knižnice objektov 11.0

    3. Kliknutím na tlačidlo OK v dialógovom okne Pridanie odkazov prijmite svoje výbery.

  4. V ponuke Zobraziť kliknite na položku Nástroje a potom presuňte ovládací prvok Tlačidlo do formulára1.

  5. Dvakrát kliknite na tlačidlo1.

    Poznámka Zobrazí sa okno s kódom formulára.

  6. Do hornej časti formulára Form1.vb pridajte nasledujúci kód:

    Imports Microsoft.Office.Interop
    
  7. Nahraďte tento kód v okne kódu:

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

    Nahradte tento 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. Aplikáciu spustíte stlačením klávesu F5.

  9. Otvorte Windows Správca úloh. V Visual Studio okna Výstup zobrazíte správy o ladení. Kliknite na tlačidlo príkazu. Všimnite si, že inštancia Excel.exe sa zobrazí v zozname Procesy.

  10. Inštancia programu Excel v zozname úloh aj po ukončení spiatonej aplikácie. Zatvorte dialógové okno a všimnite si, Excel sa už v zozname Procesy nezobrazí.

  11. Po dokončení krokov v časti Rozlíšenie sa aplikácia Office po vydaní poslednej premennej ukončí. Nahraďte funkciu v kroku 5 pomocou nasledujúceho kódu:

      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
    

Ak používate Visual C#.NET, odkaz na kód funkcie NAR():

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

Poznámka Od verzie .NET Framework 2.0 môžete na dosiahnutie rovnakého výsledku použiť namiesto funkcie System.Runtime.InteropServices.Marshal.FinalReleaseComObject namiesto slučky volania System.Runtime.InteropServices.Marshal.ReleaseComObject.
 

Riešenie problémov

Poznámka: Ak budete postupovať podľa krokov popísaných v časti "Kroky na zopakovanie správania" a server sa stále nevypína, môžete použiť ICH. Zhromažďovanie () metódy a ICHEM. Metóda WaitForPendingFinalizers() po uvoľnení posledného objektu. Keďže v režime runtime sa v RCW vykonáva kolekcia odpadkového koša, INTERAKCIA. Metóda Collect() vynúti spustenie odpadkového koša a môže uvoľniť všetky odkazy, ktoré rcw stále obsahuje. VYCHÝLIŤ. Metóda Collect() sa pokúsi obnoviť maximálnu pamäť, ktorá je k dispozícii. Všimnite si, že to nezaručuje, že sa bude znova používať všetka pamäť.

Súvisiaci produkt

Tento článok sa vzťahuje aj na:

  • Microsoft Visual Basic .NET (všetky vydania)

  • Microsoft Visual C# .NET (všetky vydania)

  • Microsoft Office 2016 (všetky vydania)

  • Microsoft Office 2013 (všetky vydania)

Potrebujete ďalšiu pomoc?

Chcete ďalšie možnosti?

Môžete preskúmať výhody predplatného, prehľadávať školiace kurzy, naučiť sa zabezpečiť svoje zariadenie a ešte oveľa viac.

Komunity pomôžu s kladením otázok a odpovedaním na ne, s poskytovaním pripomienok a so získavaním informácií od odborníkov s bohatými znalosťami.

Boli tieto informácie užitočné?

Aká je podľa vás jazyková kvalita textu?
Čo sa vám páčilo, prípadne čo nie?
Stlačením tlačidla Odoslať sa vaše pripomienky použijú na zlepšenie produktov a služieb spoločnosti Microsoft. Váš správca IT bude môcť tieto údaje zhromažďovať. Vyhlásenie o ochrane osobných údajov.

Ďakujeme za vaše pripomienky!

×