Office-toepassing wordt niet afgesloten nadat de automatisering van Visual Studio .net client

Vertaalde artikelen Vertaalde artikelen
Artikel ID: 317109 - Bekijk de producten waarop dit artikel van toepassing is.
Alles uitklappen | Alles samenvouwen

Op deze pagina

Symptomen

Wanneer u automatiseert vanuit een Microsoft Office-toepassing Microsoft Visual Basic .net of Microsoft Visual C# .net de Office-toepassing wordt niet afgesloten wanneer u roept de methode Quit .

Oorzaak

Bij Visual Studio .net aanroepen van een COM-object uit de beheerde code, wordt een Runtime Callable Wrapper (RCW) automatisch gemaakt. De RCW gemarshald gesprekken tussen de .net-toepassing en COM-object. De RCW houdt een de referentietelling voor het COM-object. Daarom, als niet alle verwijzingen zijn. uitgebracht op de RCW, COM-object niet afgesloten.

Oplossing

Zorg ervoor dat de Office-toepassing wordt afgesloten, zodat dat uw automatiseringscode voldoet aan de volgende criteria:
  • Elk object declareren als een nieuwe variabele. Wijzig bijvoorbeeld de volgende regel code
    oBook = oExcel.Workbooks.Add()
    					
    in het volgende:
    dim oBooks as Excel.Workbooks
    oBooks = oExcel.Workbooks
    oBook = oBooks.Add()
    					
  • Gebruik System.Runtime.InteropServices.Marshal.ReleaseComObject herhaald totdat het resultaat 0 wanneer u klaar bent met een object. De System.Runtime.InteropServices.Marshal.ReleaseComObject verlaagt de referentietelling van de RCW en de lus ervoor zorgen zal dat de onderliggende COM-component wordt losgelaten, ongeacht hoe vaak wordt de CLR is ingevoerd.
  • Om de verwijzing naar de variabele, de variabele instellen gelijk aan Niets of Null.
  • Gebruik de Afsluiten methode van het application-object van Office naar de server te vertellen afgesloten.

Status

Dit is de standaardwerking.

Meer informatie

Stappen om het gedrag te reproduceren

  1. Start Visual Studio .net.
  2. Klik op Nieuw in het menu bestand en klik vervolgens op Project. Selecteer Windows-toepassing onder Visual Basic-projectenen op OK. Form1 wordt standaard gemaakt.
  3. Een verwijzing naar de Objectbibliotheek van Microsoft Exceltoevoegen. Hiertoe de volgende stappen uit:
    1. Klik op Add Referencein het menu Project .
    2. Zoek de objectbibliotheek voor Excel op het tabblad COM en klik op selecteren.

      Voor Microsoft Excel 2002: Microsoft Excel 10.0 Object Library

      Opmerking Als u dat nog niet hebt gedaan, is het raadzaam dat u Download en installeer de Microsoft Office XP Primary Interop Assemblies (PIA) wordt uitgevoerd. Voor meer informatie over Office XP PIA's, klikt u op het volgende artikelnummer om het artikel in de Microsoft Knowledge Base:
      328912Microsoft Office XP primary interop assemblies (PIA) zijn beschikbaar voor downloaden
      Voor Microsoft Office Excel 2003: Microsoft Excel 11.0-objectbibliotheek
    3. Klik op OK in het dialoogvenster Verwijzingen toevoegen in uw selecties.
  4. In het menu Beeld op werkseten sleep vervolgens een besturingselement opdrachtknop naar Form1.
  5. Dubbelklik op Button1. Het codevenster voor het formulier wordt weergegeven.
  6. Voeg de volgende code boven aan Form1.vb:
    Imports Microsoft.Office.Interop
    					
  7. Vervang de code in het codevenster
        Private Sub Button1_Click(ByVal sender As System.Object, _
           ByVal e As System.EventArgs) Handles Button1.Click
        End Sub
    					
    met het volgende:
    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. Druk op F5 om de toepassing te starten.
  9. Open Windows Taakbeheer. Weergeven in Visual Studio de Het uitvoervenster naar de debug-berichten. Klik op de opdrachtknop en dat een exemplaar van Excel.exe verschijnt in de lijst processen .
  10. Het exemplaar van Excel nog steeds uitgevoerd in de taaklijst zelfs Nadat de toepassing is voltooid in de slaapstand staat. Sluit het dialoogvenster en let Excel wordt niet langer weergegeven in de lijst processen .
  11. Wanneer u de stappen in de sectie 'Oplossing' implementeren de Office-toepassing wordt afgesloten nadat het de laatste variabele vrijgegeven. Vervang de functie in stap 5 met de volgende code:
      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
    					
Als u Visual C# .net gebruikt, verwijst u naar de code van de functie NAR() :
private void NAR(object o)
{
    try 
    {
        while (System.Runtime.InteropServices.Marshal.ReleaseComObject(o) > 0) ;
    }
    catch {}
    finally 
    {
        o = null;
    }
}
Opmerking: Beginnen met .net Framework 2.0, kunt u System.Runtime.InteropServices.Marshal.FinalReleaseComObject terwijl lus roepen System.Runtime.InteropServices.Marshal.ReleaseComObject hetzelfde resultaat bereiken.

Problemen oplossen

Als u de stappen die worden beschreven in de Sectie 'Stappen te reproduceren het gedrag' en de server nog niet afgesloten kunt u de GC.Collect() methode en de GC.WaitForPendingFinalizers() methode nadat u het laatste object vrijgeven. Omdat de runtime garbagecollection uitvoert op de RCW de GC .Collect() methode forceert de garbage collector uitvoeren en mogelijk een release verwijzingen die de RCW nog steeds is. De GC .Collect() methode probeert te winnen van de maximale hoeveelheid geheugen die beschikbaar is. Let wel: Dit kan niet garanderen dat alle geheugen wordt vrijgemaakt.

Eigenschappen

Artikel ID: 317109 - Laatste beoordeling: vrijdag 3 augustus 2012 - Wijziging: 1.0
De informatie in dit artikel is van toepassing op:
  • 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
Trefwoorden: 
kbautomation kbprb kbmt KB317109 KbMtnl
Automatisch vertaald artikel
BELANGRIJK: Dit artikel is vertaald door de vertaalmachine software van Microsoft in plaats van door een professionele vertaler. Microsoft biedt u professioneel vertaalde artikelen en artikelen vertaald door de vertaalmachine, zodat u toegang heeft tot al onze knowledge base artikelen in uw eigen taal. Artikelen vertaald door de vertaalmachine zijn niet altijd perfect vertaald. Deze artikelen kunnen fouten bevatten in de vocabulaire, zinsopbouw en grammatica en kunnen lijken op hoe een anderstalige de taal spreekt en schrijft. Microsoft is niet verantwoordelijk voor onnauwkeurigheden, fouten en schade ontstaan door een incorrecte vertaling van de content of het gebruik ervan door onze klanten. Microsoft past continue de kwaliteit van de vertaalmachine software aan door deze te updaten.
De Engelstalige versie van dit artikel is de volgende: 317109

Geef ons feedback

 

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