Logga in med Microsoft
Logga in eller skapa ett konto.
Hej,
Välj ett annat konto.
Du har flera konton
Välj det konto som du vill logga in med.

Se övriga produkter som den här artikeln gäller för.

Symptom

När du automatiserar ett Microsoft Office-program från Microsoft Visual Basic .NET eller Microsoft Visual C# .NET avslutas inte Office-programmet när du anropar metoden Avsluta.

Orsak

När Visual Studio .NET anropar ett COM-objekt från hanterad kod skapas automatiskt en RcW (Runtime Callable Wrapper). RCW-ropen mellan .NET-programmet och COM-objektet. RCW behåller ett referensantal för COM-objektet. Om alla referenser inte har släppts på RCW-objektet avslutas därför inte COM-objektet.

Lösning

För att försäkra dig om Office program avslutas kontrollerar du om din automatiseringskod uppfyller följande villkor:

  • Deklarera varje objekt som en ny variabel. Ändra till exempel följande rad med kod:

    oBook = oExcel.Workbooks.Add()
    

    Ändra detta till följande:

    dim oBooks as Excel.Workbooks
    oBooks = oExcel.Workbooks
    oBook = oBooks.Add()
    
  • Använd System.Runtime.InteropServices.Packet.ReleaseComObject i en slinga tills den returnerar 0 när du är klar med att använda ett objekt. System.Runtime.InteropServices.ReleaseComObject decrements reference count of the RCW, och loopen ser till att den underliggande COM-komponenten släpps oavsett hur många gånger den har angetts igen.

  • Om du vill ta bort referensen till variabeln ställer du in variabeln på Ingenting eller Null.

  • Använd metoden Avsluta i Office-programmet för att tala om för servern att stänga av.

Status

Detta är avsiktligt.

Mer information

Steg för att återskapa beteendet

  1. Starta Visual Studio .NET.

  2. Klicka på Nytt på Arkiv-menyn och klicka sedan på Ny Project. Under Visual Basic Projekt väljer du Windows program och klickar sedan på OK.

    Obs! Formulär1 skapas som standard.

  3. Lägg till en referens till Microsoft Excel-objektbiblioteket. Gör så här:

    1. På Project klickar du på Lägg till referens.

    2. På fliken COM letar du reda på objektbiblioteket för Excel och klickar sedan på Välj.

      För Microsoft Excel 2002: Microsoft Excel 10.0

      ObjektbibliotekNote Om du inte redan har gjort det rekommenderar vi att du laddar ned och installerar Microsoft Office XP primary interop-sammansättningar (PIAs).

      Mer information om hur Office XP-PIN-koder finns i följande Microsoft Knowledge Base-artikel:

      328912 Microsoft Office XP primära interopssammansättningar (PIAs) är tillgängliga för nedladdning
        För Microsoft Office Excel 2003: Microsoft Excel 11.0-objektbibliotek

    3. Klicka på OK i dialogrutan Lägg till referenser för att godkänna dina val.

  4. Klicka på Verktygslåda på Visa-menyn och dra sedan en knappkontroll till Formulär1.

  5. Dubbelklicka på Knapp1.

    Obs! 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
    

    Byt ut följande kod:

    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 Windows i Aktivitetshanteraren. I Visual Studio visar du fönstret Utdata för att se felsökningsmeddelandena. Klicka på kommandoknappen. Observera att en instans Excel.exe instans visas i listan Processer.

  10. Instansen av Excel fortfarande körs i aktivitetslistan även efter att programmet har slutat sova. Stäng dialogrutan och observera att Excel inte längre visas i listan Processer.

  11. När du gör stegen i avsnittet "Upplösning" avslutas Office programmet efter att den släppt den sista variabeln. Byt ut funktionen i steg 5 genom att använda 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 refererar du till koden för funktionen NAR():

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

Obs! Från och med .NET Framework 2.0 kan du använda System.Runtime.InteropServices.FinalReleaseComObject i stället för att använda loop-samtal med System.Runtime.InteropServices.ReleaseComObject för att uppnå samma resultat.
 

Felsökning

Obs! Om du följer de steg som beskrivs i avsnittet "Steg för att återskapa beteende" och servern fortfarande inte stängs av, kan du använda GC. Collect()-metoden och GC. Vänta med metodenPendingFinalizers() när du släppt det sista objektet. Eftersom körningen utför skräpinsamling på RCW, GC. Metoden samla in() tvingar papperssamlaren att köras och kan släppa eventuella referenser som RCW fortfarande har. Detta är GC. Metoden Collect() försöker frigöra det maximala minne som är tillgängligt. Observera att det inte garanterar att allt minne frigöras.

Gäller för

Den här artikeln gäller även:

  • Microsoft Visual Basic .NET (alla utgåvor)

  • Microsoft Visual C# .NET (alla utgåvor)

  • Microsoft Office 2016 (alla utgåvor)

  • Microsoft Office 2013 (alla utgåvor)

Behöver du mer hjälp?

Vill du ha fler alternativ?

Utforska prenumerationsförmåner, bläddra bland utbildningskurser, lär dig hur du skyddar din enhet med mera.

Communities hjälper dig att ställa och svara på frågor, ge feedback och få råd från experter med rika kunskaper.

Hade du nytta av den här informationen?

Hur nöjd är du med språkkvaliteten?
Vad påverkade din upplevelse?
Genom att trycka på skicka, kommer din feedback att användas för att förbättra Microsofts produkter och tjänster. IT-administratören kan samla in denna data. Sekretesspolicy.

Tack för din feedback!

×