Aanmelden met Microsoft
Meld u aan of maak een account.
Hallo,
Selecteer een ander account.
U hebt meerdere accounts
Kies het account waarmee u zich wilt aanmelden.

Zie de andere producten op wie dit artikel van toepassing is.

Symptomen

Wanneer u een Microsoft Office-toepassing van Microsoft Visual Basic .NET of Microsoft Visual C# .NET automatiseert, wordt de Office-toepassing niet afgesloten wanneer u de methode Afsluiten belt.

Oorzaak

Wanneer Visual Studio .NET een COM-object aanroept vanuit beheerde code, wordt er automatisch een Runtime Callable Wrapper (RCW) gemaakt. De RCW-marshalls bellen tussen de .NET-toepassing en het COM-object. Het RCW houdt een verwijzingstelling op het COM-object bij. Als alle verwijzingen dus niet zijn uitgebracht op het RCW, wordt het COM-object niet gestopt.

Oplossing

Als u ervoor wilt zorgen dat de Office wordt afgesloten, bepaalt u of de automatiseringscode aan de volgende criteria voldoet:

  • Declareer elk object als een nieuwe variabele. Wijzig bijvoorbeeld de volgende coderegel:

    oBook = oExcel.Workbooks.Add()
    

    Wijzig dit in het volgende:

    dim oBooks as Excel.Workbooks
    oBooks = oExcel.Workbooks
    oBook = oBooks.Add()
    
  • Gebruik System.Runtime.InteropServices.Marshall.ReleaseComObject in een lus totdat deze 0 retourneert wanneer u klaar bent met het gebruik van een object. Met System.Runtime.InteropServices.Marshall.ReleaseComObject wordt het aantal verwijzingen van het RCW verwijderd en zorgt de lus ervoor dat het onderliggende COM-onderdeel wordt uitgebracht, ongeacht hoe vaak het opnieuw de CLR heeft ingevoerd.

  • Als u de verwijzing naar de variabele wilt vrijgeven, stelt u de variabele in die gelijk is aan Niets of Null.

  • Gebruik de methode Afsluiten van het Office toepassingsobject om de server te vertellen dat deze moet worden afgesloten.

Status

Dit gedrag is inherent aan het ontwerp van het product.

Meer informatie

Stappen om het gedrag te reproduceren

  1. Start Visual Studio .NET.

  2. Klik in het menu Bestand op Nieuw en klik vervolgens op Project. Selecteer Visual Basic onder Projecten Windows Toepassing en klik vervolgens op OK.

    Opmerking Formulier1 wordt standaard gemaakt.

  3. Voeg een verwijzing naar de Microsoft Excel objectbibliotheek toe. Volg de volgende stappen om dit te doen:

    1. Klik op Verwijzing toevoegen in het menu Project.

    2. Zoek op het tabblad COM de objectbibliotheek voor Excel en klik vervolgens op Selecteren.

      Voor Microsoft Excel 2002: Microsoft Excel 10.0 Object LibraryNote

      Als u dit nog niet hebt gedaan, raden we u aan de Microsoft Office XP Primary Interop Assemblies (PIAs) te downloaden en te installeren.

      Voor meer informatie over Office XP PIAs gaat u naar het volgende Microsoft Knowledge Base-artikel:

      328912 Microsoft Office XP primary interop assemblies (PIAs) zijn beschikbaar om te downloaden
        Voor Microsoft Office Excel 2003: Microsoft Excel 11.0 Object Library

    3. Klik op OK in het dialoogvenster Verwijzingen toevoegen om uw selecties te accepteren.

  4. Klik in het menu Beeld op Werkset en sleep een besturingselement Knop naar Formulier1.

  5. Dubbelklik op Knop1.

    Opmerking Het codevenster voor het formulier wordt weergegeven.

  6. Voeg de volgende code toe aan de bovenkant van Formulier1.vb:

    Imports Microsoft.Office.Interop
    
  7. Vervang de volgende code in het codevenster:

        Private Sub Button1_Click(ByVal sender As System.Object, _
           ByVal e As System.EventArgs) Handles Button1.Click
        End Sub
    

    Vervang de volgende code:

    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 uit te voeren.

  9. Open Windows Taakbeheer. In Visual Studio het venster Uitvoer weergeven om de foutopsporingsberichten weer te geven. Klik op de opdrachtknop. U ziet dat een exemplaar van Excel.exe wordt weergegeven in de lijst Processen.

  10. Het exemplaar van Excel wordt nog steeds uitgevoerd in de takenlijst, zelfs nadat de toepassing klaar is met slapen. Sluit het dialoogvenster en merk op dat Excel niet meer wordt weergegeven in de lijst Processen.

  11. Wanneer u de stappen in de sectie 'Resolutie' doet, wordt Office de toepassing afgesloten nadat de laatste variabele is uitgebracht. 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 voor de functie NAR():

private void NAR(object o)
{
    try 
    {
        while (System.Runtime.InteropServices.Marshal.ReleaseComObject(o) > 0) ;
    }
    catch {}
    finally 
    {
        o = null;
    }
}

Opmerking Vanaf .NET Framework 2.0 kunt u System.Runtime.InteropServices.Marshall.FinalReleaseComObject gebruiken in plaats van de while loop calling System.Runtime.InteropServices.Marshall.ReleaseComObject om hetzelfde resultaat te bereiken.
 

Probleemoplossing

Opmerking  Als u de stappen volgt die worden beschreven in de sectie 'Stappen om het gedrag te reproduceren' en de server nog steeds niet wordt afgesloten, kunt u de GC gebruiken. Methode Collect() en de GC. WaitForPendingFinalizers() methode nadat u het laatste object hebt uitgebracht. Omdat met de runtime garbage collection wordt uitgevoerd op de RCW, de GC. De methode Collect() dwingt de garbage collector uit te voeren en kan eventuele verwijzingen vrijgeven die de RCW nog steeds heeft. De GC. Met de methode Collect() wordt geprobeerd het maximaal beschikbare geheugen terug te vorderen. Dit garandeert niet dat alle geheugen wordt teruggevorderd.

Van toepassing op

Dit artikel is ook van toepassing op:

  • Microsoft Visual Basic .NET (alle edities)

  • Microsoft Visual C# .NET (alle edities)

  • Microsoft Office 2016 (alle edities)

  • Microsoft Office 2013 (alle edities)

Meer hulp nodig?

Meer opties?

Verken abonnementsvoordelen, blader door trainingscursussen, leer hoe u uw apparaat kunt beveiligen en meer.

Community's helpen u vragen te stellen en te beantwoorden, feedback te geven en te leren van experts met uitgebreide kennis.

Was deze informatie nuttig?

Hoe tevreden bent u met de taalkwaliteit?
Wat heeft uw ervaring beïnvloed?
Als u op Verzenden klikt, wordt uw feedback gebruikt om producten en services van Microsoft te verbeteren. Uw IT-beheerder kan deze gegevens verzamelen. Privacyverklaring.

Hartelijk dank voor uw feedback.

×