Přihlásit se pomocí účtu Microsoft
Přihlaste se nebo si vytvořte účet.
Dobrý den,
Vyberte jiný účet.
Máte více účtů.
Zvolte účet, pomocí kterého se chcete přihlásit.

Podívejte se na další produkty, na které se tento článek vztahuje.

Příznaky

Když automatizujete aplikaci Microsoft Office microsoft Visual Basic .NET nebo Microsoft Visual C# .NET, aplikace Office se při volání metody Quit neukončí.

Příčina

Když Visual Studio .NET zavolá objekt COM ze spravovaného kódu, automaticky vytvoří obálku rcw (Runtime Callable Wrapper). Funkce RCW zařazuje hovory mezi aplikací .NET a objektem COM. Funkce RCW udržuje počet odkazů na objekt COM. Pokud tedy v rcw nebyly vydány všechny odkazy, objekt COM se neukončí.

Řešení

Abyste se ujistili, Office aplikace ukončí, určete, jestli kód pro automatizaci splňuje následující kritéria:

  • Deklarujte každý objekt jako novou proměnnou. Změňte třeba následující řádek kódu:

    oBook = oExcel.Workbooks.Add()
    

    Změňte toto nastavení na následující:

    dim oBooks as Excel.Workbooks
    oBooks = oExcel.Workbooks
    oBook = oBooks.Add()
    
  • Používejte System.Runtime.InteropServices.Marshal.ReleaseComObject ve smyčce, dokud po použití objektu nevrátí hodnotu 0. System.Runtime.InteropServices.Marshal.ReleaseComObject sníží počet odkazů rcw a smyčka zajistí, že se podkladová komponenta modelu COM uvolní bez ohledu na to, kolikrát se znovu zadala do modulu CLR.

  • Pokud chcete uvolnit odkaz na proměnnou, nastavte proměnnou rovno Nothing nebo Null.

  • Pomocí metody Quit (Ukončit) Office application object to tell the server to shut down (Ukončit).

Stav

Toto chování je z návrhu.

Další informace

Postup pro reprodukci chování

  1. Spusťte Visual Studio .NET.

  2. V nabídce Soubor klikněte na Nový a potom na Project. V Visual Basic Projekty vyberte Windows a potom klikněte na OK.

    Poznámka: Ve výchozím nastavení se vytvoří formulář1.

  3. Přidejte odkaz na knihovnu Microsoft Excel objektů. Postupujte takto:

    1. V nabídce Project klikněte na Přidat odkaz.

    2. Na kartě COM vyhledejte knihovnu objektů pro Excel a potom klikněte na Vybrat.

      Pro Microsoft Excel 2002: knihovna objektů Microsoft Excel 10.0Note

      Pokud jste to ještě neudělali, doporučujeme si stáhnout a nainstalovat primární definiční sestavení Microsoft Office XP (PIA).

      Další informace o Office PIA pro xp najdete v následujícím článku znalostní báze Microsoft Knowledge Base:

      328912 Microsoft Office k dispozici ke
      stažení primární definiční sestavení XP   Pro Microsoft Office Excel 2003: Microsoft Excel 11.0 Object Library

    3. Kliknutím na OK v dialogovém okně Přidat odkazy přijměte vybrané položky.

  4. V nabídce View (Zobrazení) klikněte na Toolbox (Sada nástrojů) a přetáhněte ovládací prvek Button (Tlačítko) na Form1 (Formulář1).

  5. Poklikejte na Tlačítko1.

    Poznámka: Zobrazí se okno kódu formuláře.

  6. Do horní části formuláře Form1.vb přidejte následující kód:

    Imports Microsoft.Office.Interop
    
  7. V okně kódu nahraďte následující kód:

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

    Nahraďte následující 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. Stisknutím klávesy F5 spusťte aplikaci.

  9. Otevřete Windows Správce úloh. V Visual Studio zobrazení okna Výstup zobrazíte zprávy ladění. Klikněte na příkazové tlačítko. Všimněte si, že Excel.exe v seznamu Procesy.

  10. Instance aplikace Excel v seznamu úkolů i po ukončení aplikace do spánku. Zavřete dialogové okno a všimněte si, Excel se už v seznamu Procesy nezobrazí.

  11. Když budete dělat kroky uvedené v části Řešení, aplikace Office po uvolnění poslední proměnné. Nahraďte funkci v kroku 5 pomocí následujícího 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
    

Pokud používáte Visual C# .NET, odkazovat na kód funkce NAR():

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

Poznámka: Od verze .NET Framework 2.0 můžete použít System.Runtime.InteropServices.Marshal.FinalReleaseComObject místo smyčky while volání System.Runtime.InteropServices.Marshal.ReleaseComObject k dosažení stejného výsledku.
 

Řešení problémů

Poznámka Pokud budete postupovat podle kroků popsaných v části Kroky pro reprodukci chování a server se pořád nevypne, můžete použít gc. Metoda Collect() a gc. Metoda WaitForPendingFinalizers() po uvolnění posledního objektu. Vzhledem k tomu, že modul runtime provádí uvolňování paměti v rcw, gc. Metoda Collect() vynutí spuštění systému uvolňování paměti a může uvolnit všechny odkazy, které rcw stále obsahuje. The GC. Metoda Collect() se pokusí uvolnit maximální dostupnou paměť. Všimněte si, že to nezaručuje, že se znovu vyžádá veškerá paměť.

Pokryté produkty

Tento článek se týká taky:

  • Microsoft Visual Basic .NET (všechny edice)

  • Microsoft Visual C# .NET (všechny edice)

  • Microsoft Office 2016 (všechny edice)

  • Microsoft Office 2013 (všechny edice)

Potřebujete další pomoc?

Chcete další možnosti?

Prozkoumejte výhody předplatného, projděte si školicí kurzy, zjistěte, jak zabezpečit své zařízení a mnohem více.

Komunity vám pomohou klást otázky a odpovídat na ně, poskytovat zpětnou vazbu a vyslechnout odborníky s bohatými znalostmi.

Byly tyto informace užitečné?

Jak jste spokojeni s kvalitou jazyka?
Co ovlivnilo váš názor?
Po stisknutí tlačítka pro odeslání se vaše zpětná vazba použije k vylepšování produktů a služeb Microsoftu. Váš správce IT bude moci tato data shromažďovat. Prohlášení o zásadách ochrany osobních údajů.

Děkujeme vám za zpětnou vazbu.

×