Se de andre produkter, som denne artikel gælder for.

Symptomer

Når du automatiserer et Microsoft Office-program fra Microsoft Visual Basic .NET eller Microsoft Visual C# .NET, afsluttes Office-programmet ikke, når du kalder metoden Afslut.

Årsag

Når Visual Studio .NET kalder et COM-objekt fra administreret kode, oprettes der automatisk en RCW (Runtime Callable Wrapper). RCW-konfigurationerne ringer mellem .NET-programmet og COM-objektet. RCW'en holder et referenceantal på COM-objektet. Hvis alle referencer ikke er blevet frigivet på RCW'en, afsluttes COM-objektet derfor ikke.

Løsning

For at sikre, at Office-programmet afsluttes, skal du afgøre, om din automatiseringskode opfylder følgende kriterier:

  • Erklære hvert objekt som en ny variabel. Du kan f.eks. ændre følgende kodelinje:

    oBook = oExcel.Workbooks.Add()
    

    Skift dette til følgende:

    dim oBooks as Excel.Workbooks
    oBooks = oExcel.Workbooks
    oBook = oBooks.Add()
    
  • Brug System.Runtime.InteropServices.Universal.ReleaseComObject i en løkke, indtil den returnerer 0, når du er færdig med at bruge et objekt. System.Runtime.InteropServices.Universal.ReleaseComObject formindsker RCW'ens referenceantal, og løkken sikrer, at den underliggende COM-komponent frigives, uanset hvor mange gange den igen har indtastet CLR.

  • Hvis du vil frigive referencen til variablen, skal du angive variablen lig med Intet eller Null.

  • Brug metoden Afslut i Office program til at få serveren til at lukke ned.

Status

Denne funktionsmåde er tilsigtet.

Flere oplysninger

Trin til at genskabe funktionsmåden

  1. Start Visual Studio .NET.

  2. Klik på Ny i menuen Filer, og klik derefter på Project. Under Visual Basic projekter skal du Windows program og derefter klikke på OK.

    Bemærk! Formular1 oprettes som standard.

  3. Føj en reference til Microsoft Excel-objektbiblioteket. Det gør du ved at følge disse trin:

    1. I menuen Project skal du klikke på Add Reference.

    2. Under fanen COM skal du finde Objektbibliotek til Excel og derefter klikke på Vælg.

      Til Microsoft Excel 2002: Microsoft Excel 10.0-objektbibliotekNote

      Hvis du ikke allerede har gjort dette, anbefaler vi, at du downloader og installerer Microsoft Office XP Primary Interop Assembly (PIAs).

      Du kan finde flere oplysninger Office XP-PIA'er i følgende Microsoft Knowledge Base-artikel:

      328912 Microsoft Office kan hentes fra XP'er (Primary Interop assembly – PIA'er).
        For Microsoft Office Excel 2003: Microsoft Excel 11.0-objektbibliotek

    3. Klik på OK i dialogboksen Tilføj referencer for at acceptere dine valg.

  4. I menuen Vis skal du klikke på Værktøjskasse og derefter trække et Knap-kontrolelement til Formular1.

  5. Dobbeltklik på Knap1.

    Bemærk! Kodevinduet for formularen vises.

  6. Tilføj følgende kode øverst i Formular1.vb:

    Imports Microsoft.Office.Interop
    
  7. Erstat følgende kode i kodevinduet:

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

    Udløs følgende kode:

    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. Tryk på F5 for at køre programmet.

  9. Åbn Windows Jobliste. I Visual Studio du få vist vinduet Output for at få vist fejlfindingsmeddelelserne. Klik på kommandoknappen. Bemærk, at der vises Excel.exe forekomster på listen Processer.

  10. Forekomsten af Excel kører stadig på opgavelisten, selv når programmet er gået i søvn. Luk dialogboksen, og bemærk, Excel ikke længere vises på listen Processer.

  11. Når du udføre trinnene i sektionen "Løsning", afsluttes Office, når den sidste variabel frigives. Erstat funktionen i trin 5 ved at bruge følgende kode:

      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
    

Hvis du bruger Visual C# .NET, skal du referere til koden for funktionen OPLÆSER():

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

Bemærk! Fra og med .NET Framework 2.0 kan du bruge System.Runtime.InteropServices.Universalal.FinalReleaseComObject i stedet for det mens der ringes på loop-system.Runtime.InteropServices.DensYDComObject for at opnå det samme resultat.
 

Fejlfinding

Bemærk Hvis du følger de trin, der er beskrevet i afsnittet "Trin til at genskabe funktionsmåden", og serveren stadig ikke lukkes, kan du bruge STØRSTE.DIRG. Indsaml() metode og STØRSTE.DIG. WaitForPendingFinalizers() metode, når du slipper det sidste objekt. Da kørsel kører skraldespandssamling på RCW'en, er det største GC. Indsaml() metode tvinger skraldespandsindsamleren til at køre og frigive muligvis alle referencer, som RCW stadig har. STØRSTE.DIG. Metoden Indsaml() forsøger at frigøre den maksimale hukommelse, der er tilgængelig. Bemærk, at dette ikke garanterer, at al hukommelse frigøres.

Gælder for

Denne artikel gælder også for:

  • Microsoft Visual Basic .NET (alle udgaver)

  • Microsoft Visual C# .NET (alle udgaver)

  • Microsoft Office 2016 (alle udgaver)

  • Microsoft Office 2013 (alle udgaver)

Har du brug for mere hjælp?

Udvid dine færdigheder
Gå på opdagelse i kurser
Få nye funktioner først
Deltag i Microsoft insiders

Var disse oplysninger nyttige?

Hvor tilfreds er du med kvaliteten af sproget?
Hvad påvirkede din oplevelse?

Tak for din feedback!

×