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
-
Spustite Visual Studio .NET.
-
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. -
Pridajte odkaz na Microsoft Excel knižnice objektov. Postupujte podľa nasledujúcich krokov:
-
V ponuke Project kliknite na položku Pridať odkaz.
-
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
-
Kliknutím na tlačidlo OK v dialógovom okne Pridanie odkazov prijmite svoje výbery.
-
-
V ponuke Zobraziť kliknite na položku Nástroje a potom presuňte ovládací prvok Tlačidlo do formulára1.
-
Dvakrát kliknite na tlačidlo1.
Poznámka Zobrazí sa okno s kódom formulára. -
Do hornej časti formulára Form1.vb pridajte nasledujúci kód:
Imports Microsoft.Office.Interop
-
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
-
Aplikáciu spustíte stlačením klávesu F5.
-
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.
-
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í.
-
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)