Office-program avslutas inte efter automation från Visual Studio .net-klient

Artikelöversättning Artikelöversättning
Artikel-id: 317109 - Visa produkter som artikeln gäller.
Visa alla | Dölj alla

På den här sidan

Symptom

När du vill automatisera Microsoft Office-program från Microsoft Visual Basic .net eller Microsoft Visual C# .net Office-program avslutas inte när Du kan anropa metoden Avsluta .

Orsak

När Visual Studio .net samtal en COM-objekt från hanteras kod, skapas automatiskt en Runtime Callable Wrapper (RCW). RCW marshals samtal mellan .net-program och COM-objekt. RCW håller en referens räknar med COM-objekt. Därför, om inte alla referenser har gavs RCW avslutas COM-objekt inte.

Lösning

Kontrollera att Office-programmet avslutas, kontrollera att automation-kod uppfyller följande kriterier:
  • Deklarera varje objekt som en ny variabel. Ändra till exempel följande kodrad
    oBook = oExcel.Workbooks.Add()
    					
    till följande:
    dim oBooks as Excel.Workbooks
    oBooks = oExcel.Workbooks
    oBook = oBooks.Add()
    					
  • Använd System.Runtime.InteropServices.Marshal.ReleaseComObject i en loop till den returnerar 0 när du är klar med ett objekt. Den System.Runtime.InteropServices.Marshal.ReleaseComObject minskningar i RCW och loop referensantal kommer att säkerställa att underliggande COM-komponenten är publicerat oavsett hur många gånger har det nytt CLR.
  • Om du vill frigöra referensen till variabeln anger du variabeln lika med Ingenting eller Null.
  • Använd den Avsluta metod för Office application-objektet att tala till servern Stäng av.

Status

Detta är avsiktligt.

Mer Information

Åtgärder för att återskapa problemet

  1. Starta Visual Studio .net.
  2. Klicka på NyArkiv -menyn och sedan på projekt. Visual Basic-projektväljer Windows-program och klicka på OK. Form1 skapas som standard.
  3. Lägga till en referens till Objektbiblioteket för Microsoft Excel. Detta gör du så här:
    1. Klicka på Lägg till referensprojekt -menyn.
    2. På fliken COM hitta objektbiblioteket för Excel och klicka sedan på Välj.

      Microsoft Excel 2002: objektbibliotek för Microsoft Excel 10.0

      Obs! Om du inte redan har gjort det rekommenderas att du Hämta och installera Microsoft Office XP primära Interop-sammansättningar (PIA). Ytterligare information om primära interop-sammansättningar för Office XP klickar du på följande artikelnummer och läser artikeln i Microsoft Knowledge Base:
      328912Microsoft Office XP primära samverkansmoduler (PIA) är tillgängliga för hämtning
      För Microsoft Office Excel 2003: objektbibliotek för Microsoft Excel 11.0
    3. Klicka på OK i dialogrutan Lägg till referenser för att bekräfta dina val.
  4. Klicka på verktygslådanVisa -menyn och dra en kontroll för knappen till formulär1.
  5. Dubbelklicka på Button1. Kodfönstret för formuläret visas.
  6. Lägg till följande kod överst i Form1.vb:
    Imports Microsoft.Office.Interop
    					
  7. Ersätt följande kod i kodfönstret
        Private Sub Button1_Click(ByVal sender As System.Object, _
           ByVal e As System.EventArgs) Handles Button1.Click
        End Sub
    					
    med följande:
    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. Tryck på F5 för att köra programmet.
  9. Öppna Aktivitetshanteraren. I Visual Studio kan du visa den Utdatafönstret för att se debug-meddelanden. Klicka på kommandoknappen och Observera att en instans av Excel.exe visas i listan över processer .
  10. Instans av Excel fortfarande körs till i listan även När programmet har slutförts i viloläge. Stäng dialogrutan och Lägg märke till att Excel visas inte längre i listan över processer .
  11. När du implementerar stegen i avsnittet "Lösning" Office-program avslutas efter sista variabeln frigörs. Ersätta den funktion i steg 5 med följande kod:
      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
    					
Om du använder Visual C# .net referenskod för funktionen NAR() :
private void NAR(object o)
{
    try 
    {
        while (System.Runtime.InteropServices.Marshal.ReleaseComObject(o) > 0) ;
    }
    catch {}
    finally 
    {
        o = null;
    }
}
Anmärkning: Starta med.NET Framework 2.0 kan du använda System.Runtime.InteropServices.Marshal.FinalReleaseComObject i stället för while slinga anropa System.Runtime.InteropServices.Marshal.ReleaseComObject för att uppnå samma resultat.

Felsökning

Observera att om åtgärderna som beskrivs i den "Åtgärder för att återskapa problemet beteende" och servern fortfarande inte att stänga Du kan använda GC nedåt.Collect() metod och GC.WaitForPendingFinalizers() metod när du släpper det sista objektet. Eftersom körningsmiljön Utför skräpinsamling på RCW, GC.Collect() metoden tvingar garbage collector körs och kanske släpper något referenser som fortfarande har RCW. GC.Collect() metoden försöker frigöra maximalt minne som är tillgängligt. Observera att Detta garanterar inte att alla minne kommer att återtas.

Egenskaper

Artikel-id: 317109 - Senaste granskning: den 3 augusti 2012 - Revision: 1.0
Informationen i denna artikel gäller:
  • 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
Nyckelord: 
kbautomation kbprb kbmt KB317109 KbMtsv
Maskinöversatt
VIKTIGT: Denna artikel är översatt av Microsofts automatiska översättningsprogram och inte av en mänsklig översättare. För att Du skall ha åtkomst till alla artiklar i Knowledge Base på Ditt föredragna språk så är en del artiklar översatta av människor och en del artiklar av översättningsprogram. Tänk på att en artikel som är översatt av ett översättningsprogram inte alltid är perfekt. Artikeln kan innehålla fel ord, grammatik eller meningsbyggnad, ungefär som en utländsk talare kan göra misstag när han eller hon pratar med Dig på Ditt språk. Microsoft ansvarar inte för eventuella felaktigheter i översättningen, fel eller skador som orsakats av någon felöversättning av innehållet eller våra kunders användande av det översatta innehållet. Microsoft uppdaterar kontinuerligt mjukvaran för översättningsprogrammet.
Den engelska versionen av artikeln är följande: 317109

Ge 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