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

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
Acest articol a fost arhivat. Articolul este oferit „ca atare” şi nu va mai fi actualizat.
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.WorkbooksoBooks = oExcel.WorkbooksoBook = 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 SubPrivate 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.
GC.Collect ReleaseComObject; FinalReleaseComObject

Avertisment: acest articol a fost tradus automat

Proprietăți

ID articol: 317109 - Ultima examinare: 12/07/2015 08:49:05 - Revizie: 1.0

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

  • kbnosurvey kbarchive kbautomation kbprb kbmt KB317109 KbMtro
Feedback