Office-program avsluttes ikke etter automatisering fra Visual Studio .net-klient

Artikkeloversettelser Artikkeloversettelser
Artikkel-ID: 317109 - Vis produkter som denne artikkelen gjelder for.
Vis alt | Skjul alt

På denne siden

Symptom

Når du skal automatisere Microsoft Office-program fra Microsoft Visual Basic .net eller Microsoft Visual C# .net Office-program avsluttes ikke når du kaller metoden Quit .

Årsak

Når en COM-kall for Visual Studio .net-objektet fra administrert kode, opprettes automatisk en Runtime Callable Wrapper (RCW). RCW marshals samtaler mellom .net-program og COM-objekt. RCW holder en referanseantall på COM-objekt. Derfor, hvis ikke er alle referanser utgitt av RCW avsluttes COM-objektet ikke.

Løsning

Hvis du vil forsikre deg om at Office-program avsluttes, må du kontrollere at at dine automatiseringskoden oppfyller følgende kriterier:
  • Deklarer hvert objekt som en ny variabel. Hvis du for eksempel endre følgende kodelinje
    oBook = oExcel.Workbooks.Add()
    					
    på følgende:
    dim oBooks as Excel.Workbooks
    oBooks = oExcel.Workbooks
    oBook = oBooks.Add()
    					
  • Bruk System.Runtime.InteropServices.Marshal.ReleaseComObject i en løkke før den returnerer 0 når du er ferdig med å bruke et objekt. Den System.Runtime.InteropServices.Marshal.ReleaseComObject reduserer referanseantallet for RCW og løkken vil sikre at underliggende COM-komponenten er gitt ut uansett hvordan inn på mange ganger det er nytt CLR.
  • Hvis du vil frigi referanse til variabelen, kan du definere variabelen lik Ingenting eller Null.
  • Bruk av Avslutt metode for Office application-objektet til å fortelle serveren Avslutt.

Status

Dette virkemåten er standard.

Mer informasjon

Fremgangsmåte for å gjenskape problemet

  1. Start Visual Studio .net.
  2. fil -menyen, velg Ny og deretter prosjekt. Under Visual Basic-prosjekter, velger du Windows-program , og klikk OK. Form1 opprettes som standard.
  3. Legge til en referanse til Objektbiblioteket for Microsoft Excel. Bruk følgende fremgangsmåte for å gjøre dette:
    1. Klikk Legg til referanseprosjekt -menyen.
    2. COM -kategorien, Finn objektbiblioteket for Microsoft Excel, og deretter Velg.

      For Microsoft Excel 2002: Microsoft Excel 10.0-objektbibliotek

      Obs! Hvis du ikke allerede har gjort det, anbefales det at du laste ned og installere det Microsoft Office XP Primary Interop-samlinger (PIAer). Hvis du vil ha mer informasjon om PIAer for Office XP, kan du klikke følgende artikkelnummer for å vise artikkelen i Microsoft Knowledge Base:
      328912Microsoft Office XP primære interop-samlinger (PIAer) er tilgjengelig for nedlasting
      For Microsoft Office Excel 2003: Microsoft Excel 11.0-objektbibliotek
    3. Klikk OK i dialogboksen Legg til referanser for å godta valgene.
  4. Klikk VerktøykasseVis -menyen, og deretter dra en knappekontroll til Form1.
  5. Dobbeltklikk Button1. Kodevinduet for skjemaet vises.
  6. Legg til følgende kode øverst i Form1.vb:
    Imports Microsoft.Office.Interop
    					
  7. Erstatt følgende kode i kodevinduet
        Private Sub Button1_Click(ByVal sender As System.Object, _
           ByVal e As System.EventArgs) Handles Button1.Click
        End Sub
    					
    med følgende:
    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. Trykk F5 for å kjøre programmet.
  9. Åpne Windows Oppgavebehandling. I Visual Studio, kan du vise den Utdatavinduet for å se debug-meldinger. Klikk kommandoknappen, og Legg merke til at en forekomst av Excel.exe som vises i listen over prosesser .
  10. Forekomst av Excel fremdeles kjøres i oppgavelisten selv etter at programmet er fullført i hvilemodus. Lukke dialogboksen og Legg merke til at Excel vises ikke lenger i listen over prosesser .
  11. Når du implementerer trinnene i delen "Løsning" Office-programmet avsluttes etter at det utgir den siste variabelen. Erstatt den funksjonen i trinn 5 med 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 bruker Visual C# .net, referere til koden for NAR() -funksjon:
private void NAR(object o)
{
    try 
    {
        while (System.Runtime.InteropServices.Marshal.ReleaseComObject(o) > 0) ;
    }
    catch {}
    finally 
    {
        o = null;
    }
}
Obs!: Starter med .net Framework 2.0, kan du bruke System.Runtime.InteropServices.Marshal.FinalReleaseComObject i stedet for stund loop kaller System.Runtime.InteropServices.Marshal.ReleaseComObject for å oppnå samme resultat.

Feilsøking i forbindelse med

Vær oppmerksom på at hvis du følger trinnene som er beskrevet i de "Trinn til Reproduce virkemåten"-delen, og serveren fremdeles ikke av ned, kan du bruke GC- .Collect() -metoden og GC- .WaitForPendingFinalizers() metoden når du slipper det siste objektet. Fordi kjøretidsfilen utfører datasanering RCW, GC- .Collect() metoden tvinger garbage collector kjører og kanskje frigi noen referanser til RCW er fremdeles. -GC.Collect() metoden forsøker å gjenvinne maksimalt minne som er tilgjengelig. Vær oppmerksom på at Dette garanterer ikke at hele minnet til gode.

Egenskaper

Artikkel-ID: 317109 - Forrige gjennomgang: 3. august 2012 - Gjennomgang: 1.0
Informasjonen i denne artikkelen gjelder:
  • 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
Nøkkelord: 
kbautomation kbprb kbmt KB317109 KbMtno
Maskinoversatt
Viktig: Denne artikkelen har blitt maskinoversatt, og dermed ikke oversatt av en person. For at alle artikler i vår database skal være oversatt til ditt språk, vil Microsoft benytte både personoversatte og maskinoversatte artikler. Det er viktig å merke seg at en maskinoversatt artikkel ikke alltid er perfekt. Det kan forekomme stave, strukturelle eller grammatiske feil. Microsoft er ikke ansvarlig for unøyaktigheter, feil eller skade ved bruk av innhold i artikkel som måtte forårsakes av feiloversettelse. Microsoft vil jevnlig oppdatere sitt maskinoversettelses programvare.
Den engelske versjonen av denne artikkelen er den følgende: 317109

Gi tilbakemelding

 

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