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 .
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.
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.
Dit
is de standaardwerking.
Stappen om het gedrag te reproduceren
- Start Visual Studio .net.
- 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.
- Een verwijzing naar de Objectbibliotheek van Microsoft Exceltoevoegen. Hiertoe de volgende stappen uit:
- Klik op Add Referencein het menu Project .
- 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:328912
(http://support.microsoft.com/kb/328912/
)
Microsoft Office XP primary interop assemblies (PIA) zijn beschikbaar voor downloaden
Voor Microsoft Office Excel 2003: Microsoft Excel 11.0-objectbibliotheek - Klik op OK in het dialoogvenster Verwijzingen toevoegen in uw selecties.
- In het menu Beeld op werkseten sleep vervolgens een besturingselement opdrachtknop naar Form1.
- Dubbelklik op Button1. Het codevenster voor het formulier wordt weergegeven.
- Voeg de volgende code boven aan Form1.vb:
Imports Microsoft.Office.Interop
- 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
- Druk op F5 om de toepassing te starten.
- 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 .
- 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 .
- 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.
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
| kbautomation kbprb kbmt KB317109 KbMtnl |
Automatische vertalingBELANGRIJK: 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
(http://support.microsoft.com/kb/317109/en-us/
)