Aplikace sady Office není ukončena po automatizace z aplikace Visual Studio .NET klienta

Příznaky

Při automatizaci aplikace sady Microsoft Office z aplikace Microsoft Visual Basic .NET nebo Microsoft Visual C# .NET aplikace sady Office není ukončena při volání metody Quit .

Příčina

Při Visual Studio .NET volání objektu modelu COM ze spravovaného kódu, automaticky vytvoří obálky objekt (Runtime Callable RCW). Objekt RCW zařazuje volání mezi aplikací .NET a COM objektu. Objekt RCW udržuje počet odkazů na objekt COM. Proto pokud ještě uvolněny všechny odkazy na objekt RCW, objekt modelu COM není ukončena.

Řešení

Zajistit, že ukončení aplikace sady Office, ujistěte se, že váš kód automatizace splňuje následující kritéria:
  • Každý objekt lze deklarujte jako novou proměnnou. Například změňte následující řádek kódu
    oBook = oExcel.Workbooks.Add()
    následující:
    dim oBooks as Excel.WorkbooksoBooks = oExcel.Workbooks
    oBook = oBooks.Add()

  • Použijte System.Runtime.InteropServices.Marshal.ReleaseComObject ve smyčce, dokud po dokončení pomocí objektu vrátí hodnotu 0. System.Runtime.InteropServices.Marshal.ReleaseComObject sníží počet odkazů Objekt RCW a smyčka zajistí, že je základní součást COM vydány bez ohledu na to, jak mnohokrát znovu vstoupil CLR.
  • Chcete-li uvolnit odkaz na proměnnou, nastavte proměnné rovno Nothing nebo Null.
  • Ověření pravosti serveru ukončit pomocí metody Quit objektu aplikace Office.

Stav

Toto chování je záměrné.

Další informace

Kroky pro reprodukci chování

  1. Spusťte aplikaci Visual Studio .NET.
  2. V nabídce soubor klepněte na příkaz Nový a klepněte na příkaz projekt. Ve skupinovém rámečku Projekty jazyka Visual Basicvyberte Aplikace systému Windows a klepněte na tlačítko OK. Ve výchozím nastavení je vytvořen formulář Form1.
  3. Přidáte odkaz na Knihovna objektů Microsoft Excel. Chcete-li to provést, postupujte takto:
    1. V nabídce projekt klepněte na tlačítko Přidat odkaz.
    2. Na kartě COM vyhledejte Knihovna objektů aplikace Excel a potom klepněte na tlačítko Vybrat.

      Pro aplikaci Microsoft Excel 2002: Knihovna objektů Microsoft Excel 10.0

      Poznámka: Pokud jste tak již neučinili, je vhodné stáhnout a nainstalovat Microsoft Office XP primární definiční sestavení (PIA).

      Další informace o sestaveních PIA sady Office XP klepněte na následující číslo článku databáze Microsoft Knowledge Base:

      328912 Microsoft Office XP primární sestavení interop (PIA) jsou k dispozici ke stažení

      Aplikace Microsoft Office Excel 2003: aplikace Microsoft Excel 11.0 Object Library
    3. Klepněte na tlačítko OK v dialogovém okně Přidat odkazy potvrďte výběr.
  4. V nabídce Zobrazit klepněte na panelu nástrojůa potom přetáhněte ovládacího prvku tlačítko na Form1.
  5. Poklepejte na Button1. Zobrazí se okno kód pro formulář.
  6. Přidejte následující kód k horní Form1.vb:
    Imports Microsoft.Office.Interop
  7. Nahraďte následující kód v okně Kód
        Private Sub Button1_Click(ByVal sender As System.Object, _       ByVal e As System.EventArgs) Handles Button1.Click
    End Sub

    pomocí následujících kroků:
    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 Správce úloh systému Windows. V aplikaci Visual Studio zobrazí výstupní okno Chcete-li zobrazit zprávy ladění. Všimněte si, že instance Excel.exe zobrazí v seznamu procesů klepněte na příkazové tlačítko.
  10. Instance aplikace Excel stále spuštěna v seznamu úkolů i po dokončení aplikace v režimu spánku. Zavřete dialogové okno a Všimněte si, že aplikace Excel nebude již zobrazena v seznamu procesů .
  11. Při implementaci kroky v části "Řešení", ukončí aplikace Office po jeho vydání poslední proměnné. Nahraďte následující kód funkce v kroku 5:
      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, referenční kód pro funkci NAR() :
private void NAR(object o){
try
{
while (System.Runtime.InteropServices.Marshal.ReleaseComObject(o) > 0) ;
}
catch {}
finally
{
o = null;
}
}

Poznámka: Počínaje rozhraní.NET Framework 2.0, můžete použít System.Runtime.InteropServices.Marshal.FinalReleaseComObject namísto klienta při opakování volání System.Runtime.InteropServices.Marshal.ReleaseComObject k dosažení stejného výsledku.

Poradce při potížích

Všimněte si, že pokud použijete kroky popsané v části "Kroky pro reprodukci the chování" a server stále nelze vypnout, můžete použít GC. Collect() metoda a GC. WaitForPendingFinalizers() metoda po vydání poslední objekt. Vzhledem k tomu, že modul runtime provádí uvolňování Objekt RCW, GC. Collect() metoda vynutí uvolňování paměti ke spuštění a může uvolnit všechny odkazy, které má stále Objekt RCW. GC. Collect() metoda se pokusí uvolnit maximální velikost paměti, která je k dispozici. Všimněte si, že to nezaručuje znovu použít všechny paměti.
Vlastnosti

ID článku: 317109 - Poslední kontrola: 20. 1. 2017 - Revize: 2

Váš názor