Aplicație Office nu închide după automatizare la Visual Studio .net client

Traduceri articole Traduceri articole
ID articol: 317109 - View products that this article applies to.
Măriți totul | Reduceți totul

În această pagină

Simptome

Când aveți automatiza o aplicație Microsoft Office din Microsoft Visual Basic .net sau Microsoft Visual C# .net, aplicație Office nu închide când ai apel sosit metoda Quit .

Cauză

Când Visual Studio .net apeluri COM un obiect din gestionate cod, acesta creează automat un Runtime apelabilă înveliș (RCW). RCW Mareșali apeluri între aplicarea .net și obiect COM. RCW păstrează o numărul de referin?ă pe obiect COM. Prin urmare, dacă nu au fost toate referințele lansat pe RCW, obiect COM nu ieși.

Rezoluție

Asigurați-vă că aplicația Office se închide, asigurați-vă că că codul dvs. de automatizare îndepline?te următoarele criterii:
  • Fiecare obiect se declara ca o variabilă nou. De exemplu, modificați următoarea linia Către de cod
    oBook = oExcel.Workbooks.Add()
    					
    în urma:
    dim oBooks as Excel.Workbooks
    oBooks = oExcel.Workbooks
    oBook = oBooks.Add()
    					
  • Utilizarea System.Runtime.InteropServices.Marshal.ReleaseComObject într-o buclă până se întoarce 0 când ați terminat folosind un obiect. The System.Runtime.InteropServices.Marshal.ReleaseComObject decrements numărul de referin?ă RCW ?i bucla va asigura că componenta COM care stau la baza este lansat indiferent cum de multe ori acesta a reintrat CLR.
  • Pentru a elibera trimiterea la variabila, setați variabila egal cu Nimic sau Nul.
  • Utilizarea Părăsiți metoda de obiect de aplicație Office să-i spuneți server pentru a închide.

Stare

Acest lucru comportament este cel proiectat.

Informații suplimentare

Pași pentru a reproduce comportamentul

  1. Începe Visual Studio .net.
  2. Din meniul Fișier , faceți clic pe nou și apoi faceți clic pe proiectul. Sub Proiectele Visual Basic, selectați Aplicație Windows și faceți clic pe OK. implicit, se creează Form1.
  3. Adăugați o referință la Biblioteca obiect Microsoft Excel. Pentru aceasta, urmați acești pași:
    1. Din meniul proiect , faceți clic pe Adăugare de referin?ă.
    2. Pe fila COM , localizați biblioteca obiect de Excel și apoi faceți clic pe Selectare.

      Pentru Microsoft Excel 2002: biblioteca obiect Microsoft Excel 10.0

      Notă Dacă nu ați făcut deja acest lucru, este recomandat ca tu Descărcați și instalați Microsoft Office XP Primary Interop adunărilor (PIAs). Pentru informații suplimentare despre Office XP PIAs, faceți clic pe următorul număr de articol pentru a vedea articolul în bază de cunoștințe Microsoft:
      328912Microsoft Office XP ansamblurilor interop primară (PIAs) sunt disponibile pentru descărcare
      Pentru Microsoft Office Excel 2003: Microsoft Excel 11.0 Object Library
    3. Faceți clic pe OK în casetă de dialog Adăugare trimiteri pentru a accepta selecțiile.
  4. În meniul vizualizare Proiect , faceți clic pe caseta de instrumenteși apoi glisați un buton de control Form1.
  5. Faceți dublu clic pe Button1. Apare fereastra de cod pentru formular.
  6. Adăugați următorul cod în partea de sus a Form1.vb:
    Imports Microsoft.Office.Interop
    					
  7. Înlocuiți următorul cod în fereastra code
        Private Sub Button1_Click(ByVal sender As System.Object, _
           ByVal e As System.EventArgs) Handles Button1.Click
        End Sub
    					
    cu următoarele:
    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. Apăsați F5 pentru a rula aplicația.
  9. Deschideți Managerul de activități Windows. În Visual Studio, afișați Ieșire ferestrei pentru a vizualiza mesaje de depanare. Faceți clic pe butonul de comandă și Re?ine?i c? o instanță a Excel.exe apare în Listă tabel de procese .
  10. Instanța de Excel încă rulează în listă de activități chiar după punerea în aplicare a terminat de dormit. Închideți casetă de dialog și Re?ine?i c? Excel nu mai apare în Listă tabel de procese .
  11. Când implementați pașii din secțiunea „Rezolvare", aplicație Office se închide după ce se lansează ultimul variabila. Înlocuiți Funcția în pasul 5 cu urmatorul cod:
      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
    					
Dacă tu ești folosire Visual C# .net, referin?ă codul pentru funcția de NAR() :
private void NAR(object o)
{
    try 
    {
        while (System.Runtime.InteropServices.Marshal.ReleaseComObject(o) > 0) ;
    }
    catch {}
    finally 
    {
        o = null;
    }
}
Notă: Incepand cu .NET Framework 2.0, aveți posibilitatea să utilizați System.Runtime.InteropServices.Marshal.FinalReleaseComObject în loc de marcă de timp bucla de asteptare System.Runtime.InteropServices.Marshal.ReleaseComObject pentru a atinge acela?i rezultat.

Depanare

Rețineți că dacă urmați pașii descriși în Secțiunea „pași pentru a Reproduce comportamentul", și server încă nu se închide în jos, puteți utiliza GC.Collect() metoda și GC.WaitForPendingFinalizers() metoda după când eliberați ultimul obiect. Pentru că runtime efectuează colectarea de gunoi pe RCW, GC.Collect() metoda forțele Colectorul gunoiului spre a alerga și ar putea elibera orice referințe care are încă RCW. GC.Collect() metoda încearcă să revendice memoria maximă disponibilă. Re?ine?i c? Acest lucru nu garantează că toate memoria va fi regenerate.

Proprietă?i

ID articol: 317109 - Ultima examinare: 3 august 2012 - Revizie: 1.0
Se aplică la:
  • 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
Cuvinte cheie: 
kbautomation kbprb kbmt KB317109 KbMtro
Traducere automată
IMPORTANT: Acest articol a fost tradus de software-ul de traducere automată Microsoft, si nu de un traducător. Microsoft vă oferă atât articole traduse de persoane, cât și articole traduse automat, astfel incat aveti access la toate articolele din Baza noastră de informatii în limba dvs. materna. Totuși, un articol tradus automat nu este întotdeauna perfect. Acesta poate conține greșeli de vocabular, sintaxă sau gramatică, la fel cum un vorbitor străin poate face greșeli vorbind limba dvs. materna. Compania Microsoft nu este responsabilă pentru nici o inexactitate, eroare sau daună cauzată de traducerea necorespunzătoare a conținutului sau de utilizarea traducerii necorespunzătoare de către clienții nostri. De asemenea, Microsoft actualizează frecvent software-ul de traducere automată.
Face?i clic aici pentru a vizualiza versiunea în limba engleză a acestui articol: 317109

Trimite?i 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