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í
-
Spusťte Visual Studio .NET.
-
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. -
Přidejte odkaz na knihovnu Microsoft Excel objektů. Postupujte takto:
-
V nabídce Project klikněte na Přidat odkaz.
-
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
-
Kliknutím na OK v dialogovém okně Přidat odkazy přijměte vybrané položky.
-
-
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).
-
Poklikejte na Tlačítko1.
Poznámka: Zobrazí se okno kódu formuláře. -
Do horní části formuláře Form1.vb přidejte následující kód:
Imports Microsoft.Office.Interop
-
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
-
Stisknutím klávesy F5 spusťte aplikaci.
-
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.
-
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í.
-
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)