Aplikácia balíka Office nie skončiť po automatizácie z Visual Studio .NET klienta

Preklady článku Preklady článku
ID článku: 317109 - Zobraziť produkty, ktorých sa tento článok týka.
Rozbaliť všetko | Zbaliť všetko

Na tejto stránke

Príznaky

Keď môžete automatizovať aplikácia Microsoft Office od spoločnosti Microsoft Visual Basic .NET alebo Microsoft Visual C# .NET, aplikácia Office neodíde keď voláte metódu Quit .

Príčina

Keď Visual Studio .NET vyzýva objektom COM zo spravovaného kódu automaticky vytvára Runtime Disponibilná Wrapper (RCW). RCW maršali hovory medzi .NET aplikácií a objektom COM. RCW udržiava referenčným počítadlom COM objektu. Preto, ak všetky odkazy neboli uvoľnené na RCW, objekt COM neodíde.

Riešenie

Uistite sa, že aplikácia balíka Office skončí, uistite sa, že váš kód Automatizácia spĺňa tieto kritériá:
  • Vyhlásiť každý objekt ako novú premennú. Napríklad, changethe po riadok kódu
    oBook = oExcel.Workbooks.Add()
    					
    na nasledujúce:
    dim oBooks as Excel.Workbooks
    oBooks = oExcel.Workbooks
    oBook = oBooks.Add()
    					
  • Použitie System.Runtime.InteropServices.Marshal.ReleaseComObject v slučke až 0 vráti po skončení pomocou objektu. Na System.Runtime.InteropServices.Marshal.ReleaseComObject prechádzajúceho referenčným počítadlom RCW a slučky zabezpečí, že základné súčasti COM je prepustený bez ohľadu na to, ako mnohokrát znovu vstúpil CLR.
  • K uvoľneniu odkaz na premennú, nastaviť variableequal Nič alebo Hodnotu null.
  • Použitie Ukončite metódu objektu application úradu oznámiť serveru toshut nadol.

Stav

Toto správanie je zámerné.

Ďalšie informácie

Kroky na reprodukovanie správania

  1. Spustiť Visual Studio .NET.
  2. V ponuke súbor kliknite na položku nové a kliknite na projekt. Podľa Projektov programu Visual Basic, vyberte Windows aplikácie a kliknite na tlačidlo OK. Form1 sa vytvorí na základe predvoleného nastavenia.
  3. Pridať odkaz na Objektová knižnica programu Microsoft Excel. Robiť to, postupujte nasledovne:
    1. Na Project ponuky, kliknite na tlačidlo Pridať odkaz.
    2. Na COM kartu, vyhľadajte Objektová knižnica programu Excel a potom kliknite na tlačidlo vybrať.

      Program Microsoft Excel 2002: Microsoft Excel 10.0 Object Library

      Poznámka Ak ste tak už neurobili, odporúča sa, že si stiahnete a nainštalujete Microsoft Office XP Primary Interop Assemblies (Pia). Ďalšie informácie o Office XP PIAs, po kliknutí na nasledovné číslo článku publikovaného v databáze Microsoft Knowledge Base:
      328912 Microsoft Office XP primárne pre primárnu spoluprácu assemblies (Pia) sú k dispozícii na stiahnutie
      Pre program Microsoft Office Excel 2003: 11,0 Objektová knižnica programu Microsoft Excel
    3. Kliknite na položku OK v Pridať odkazy dialógové potvrdíte váš výber.
  4. V ponuke Zobraziť , kliknite na tlačidlo Toolbox, a potom presuňte ovládací prvok tlačidla na Form1.
  5. Dvakrát kliknite na Button1. Zobrazí sa okno kód pre formulár.
  6. Do hornej časti Form1.vb, pridajte nasledujúci kód:
    Imports Microsoft.Office.Interop
    					
  7. Nasledujúci kód v okne kód nahradiť
        Private Sub Button1_Click(ByVal sender As System.Object, _
           ByVal e As System.EventArgs) Handles Button1.Click
        End Sub
    					
    s týmto:
    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. Stlačením klávesu F5 na spustenie aplikácie.
  9. Otvorte správcu úloh systému Windows. V Visual Studio, okno theOutput vidieť debug správy. Kliknite na príkazové tlačidlo a inštanciu Poznámka agentúrnym Excel.exe sa zobrazí v zozname procesov .
  10. Inštancie programu Excel stále beží v evenafter zoznam úloh aplikácie dokončil spí. Zatvorte dialógové okno a poznamenajte si thatExcel už nezobrazí v zozname procesov .
  11. Pri implementácii kroky v časti "Riešenie", aplikácii balíka Office skončí po uvoľňuje posledný premennej. Thefunction v krok 5 nahraďte nasledujúci kód:
      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, referenčný kód pre funkciu NAR() :
private void NAR(object o)
{
    try 
    {
        while (System.Runtime.InteropServices.Marshal.ReleaseComObject(o) > 0) ;
    }
    catch {}
    finally 
    {
        o = null;
    }
}
Poznámka: Počnúc .NET Framework 2.0, môžete použiť System.Runtime.InteropServices.Marshal.FinalReleaseComObject namiesto toho, kým opakovanie volania System.Runtime.InteropServices.Marshal.ReleaseComObject na dosiahnutie rovnakého výsledku.

Riešenie problémov

Všimnite si, že ak budete postupovať podľa krokov, ktoré sú opísané v časti "Kroky reprodukovať správanie" a server stále nie vypnúť, môžete použiť GC.Collect() metóda a GC.WaitForPendingFinalizers() metódy po uvoľnení posledný objekt. Pretože runtime vykonáva odvoz odpadu RCW, GC.Collect() metóda sily smetiar spustiť a môže vydať akékoľvek odkazy, ktoré RCW ešte. GC.Collect() metóda sa snaží kultivovať maximálnej pamäte, ktorá je k dispozícii. Všimnite si, že to nezaručuje, že všetky pamäte bude prehlásil.

Vlastnosti

ID článku: 317109 - Posledná kontrola: 10. novembra 2013 - Revízia: 3.0
Informácie v tomto článku sa týkajú nasledujúcich produktov:
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
Kľúčové slová: 
kbautomation kbprb kbmt KB317109 KbMtsk
Strojovo preložené
DÔLEŽITÉ: Tento článok je preložený pomocou softvéru na strojový preklad od spoločnosti Microsoft a možno ho opraviť prostredníctvom technológie Community Translation Framework (CTF). Microsoft ponúka strojovo preložené články, články upravené komunitou aj články preložené prekladateľmi, aby zabezpečil prístup ku všetkým článkom databázy Knowledge Base vo viacerých jazykoch. Strojovo preložené články aj upravené články môžu obsahovať chyby týkajúce sa slovnej zásoby, syntaxe alebo gramatiky. Microsoft nenesie zodpovednosť za akékoľvek nepresnosti, chyby alebo škody spôsobené neprávnym prekladom obsahu alebo jeho použitím zo strany našich zákazníkov. Ďalšie informácie o technológii CTF nájdete na lokalite http://support.microsoft.com/gp/machine-translation-corrections/sk.
Pokiaľ chcete vidieť anglickú verziu článku, kliknite sem: 317109

Odošlite odozvu

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com