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
-
Start Visual Studio .NET.
-
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. -
Voeg een verwijzing naar de Microsoft Excel objectbibliotheek toe. Volg de volgende stappen om dit te doen:
-
Klik op Verwijzing toevoegen in het menu Project.
-
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 -
Klik op OK in het dialoogvenster Verwijzingen toevoegen om uw selecties te accepteren.
-
-
Klik in het menu Beeld op Werkset en sleep een besturingselement Knop naar Formulier1.
-
Dubbelklik op Knop1.
Opmerking Het codevenster voor het formulier wordt weergegeven. -
Voeg de volgende code toe aan de bovenkant van Formulier1.vb:
Imports Microsoft.Office.Interop
-
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
-
Druk op F5 om de toepassing uit te voeren.
-
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.
-
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.
-
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)