Bejelentkezés Microsoft-fiókkal
Jelentkezzen be, vagy hozzon létre egy fiókot.
Üdvözöljük!
Válasszon másik fiókot.
Több fiókja van
Válassza ki a bejelentkezéshez használni kívánt fiókot.

Tekintse meg a cikk többi termékét is.

Jelenségek

Amikor automatizál egy Microsoft Office-alkalmazást a Microsoft Visual Basic .NET vagy a Microsoft Visual C# .NET alkalmazásból, az Office-alkalmazás nem tűnik el, amikor a Kilépés metódust hívja.

A probléma oka

Amikor Visual Studio .NET egy COM-objektumot felügyelt kódból hív meg, automatikusan létrehoz egy futásidejű, hívható wrappert (RCW). Az RCW a .NET-alkalmazás és a COM-objektum között bonyolítja a hívásokat. Az RCW megőrzi a hivatkozásokat a COM-objektumon. Ezért ha még nem adott ki minden hivatkozást az RCW-n, a COM-objektum nem lép ki.

Megoldás

Ha meg szeretné győződni arról, hogy Office alkalmazás kilép, állapítsa meg, hogy az automatizálási kód megfelel-e az alábbi feltételeknek:

  • Az egyes objektumokat deklarálhatja új változóként. Módosítsa például a következő kódsort:

    oBook = oExcel.Workbooks.Add()
    

    Módosítsa ezt a következőre:

    dim oBooks as Excel.Workbooks
    oBooks = oExcel.Workbooks
    oBook = oBooks.Add()
    
  • A System.Runtime.InteropServices.Fogaját.ReleaseComObject függvényt addig használja, amíg az egy objektum használatának befejezése után 0-t nem ad vissza. A System.Runtime.InteropServices.Csakbűn.ReleaseComObject leszámolja az RCW hivatkozási számát, és a hurok azt is lehetővé teszi, hogy a mögöttes COM összetevő elérhető legyen attól függetlenül, hogy hányszor adta meg újra a CLR-t.

  • A változó hivatkozásának kibocsátáshoz állítsa a Null vagy a Semmi értéket a változóra.

  • Az Office kilépési metódusával állítsa le a kiszolgálót.

Állapot

A jelenség szándékos.

További információ

Steps to reproduce the behavior

  1. Indítsa Visual Studio .NET-t.

  2. Kattintson a Fájl menü Új parancsára, majd a Helyi Project. A Visual Basic alatt válassza az Alkalmazás Windows lehetőséget, majd kattintson az OK gombra.

    Megjegyzés Az űrlap1 alapértelmezés szerint létrejön.

  3. Adjon hozzá egy hivatkozást a Microsoft Excel objektumtárhoz. Ezt a következőképpen teheti meg:

    1. A Hivatkozás Project kattintson a Hivatkozás hozzáadása elemre.

    2. A COM lapon keresse meg az objektumtárat a Excel majd kattintson a Kijelölés gombra.

      Microsoft Excel 2002 esetén: Microsoft Excel 10.0-s objektumtárNote

      Ha még nem tette meg, javasoljuk, hogy töltse le és telepítse az Microsoft Office XP elsődlegesop-szerelvényeket (PIA-k).

      Az XP-Office a Microsoft Tudásbázis következő cikkében talál további információt:

      328912 Microsoft Office XP rendszer elsődleges interop-szerelvényei (PIA-k) letölthetők
        2003-as Microsoft Office Excel: Microsoft Excel 11.0-s objektumtár

    3. Kattintson az OK gombra a Hivatkozások hozzáadása párbeszédpanelen a kijelölések elfogadásához.

  4. A Nézet menüben kattintson az Eszközkészlet elemre, majd húzzon egy gombvezérlőt az Űrlap1 elemre.

  5. Kattintson duplán a Gombra1.

    Megjegyzés Megjelenik az űrlap kódablaka.

  6. Adja hozzá a következő kódot az Űrlap1.vb lap tetejéhez:

    Imports Microsoft.Office.Interop
    
  7. Cserélje le a következő kódot a kódablakban:

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

    Helyettesítse a következő kódot:

    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. Az alkalmazás futtatásához nyomja le az F5 billentyűt.

  9. Nyissa Windows Feladatkezelőt. A Visual Studio a Kimeneti ablak megjelenítésével jelenítse meg a hibakeresési üzeneteket. Kattintson a parancsgombra. Figyelje meg, hogy egy Excel.exe megjelenik a Folyamatok listában.

  10. Az alkalmazás Excel még akkor is fut a feladatlistában, ha az alkalmazás alvólött. Zárja be a párbeszédpanelt, és figyelje Excel, hogy a lista már nem jelenik meg a Folyamatok listában.

  11. A "Megoldás" szakasz lépéseit követve a Office az utolsó változó megjelenése után kilép. Cserélje le a függvényt az 5. lépésben az alábbi kóddal:

      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
    

Visual C# .NET használata esetén használja a NAR() függvény kódját:

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

Megjegyzés: .NET-keretrendszer 2.0-s verziótól kezdődően ugyanazt az eredményt érheti el, ha a System.Runtime.InteropObject parancsra van használhatja a System.Runtime.InteropServices.ReleaseComObject parancs helyett.
 

Hibaelhárítás

Megjegyzés: Ha a "Lépések a viselkedés sokszorosításához" című szakaszban leírt lépéseket követi, és a kiszolgáló továbbra sem áll le, használhatja az ügyfélleállítani képes kiszolgálót. A Collect() metódus és a GC. WaitForPendingFinalizers() metódus az utolsó objektum kiadása után. Mivel a futásidejű kukák az RCW-n, a GC-n is végrehajtják a kukát. A Collect() metódus a kukát futásra kényszeríti, és az RCW esetleges hivatkozását is felszabadíthatja. A GC. A Collect() metódus megpróbálja visszanyerni a rendelkezésre álló maximális memóriát. Figyelje meg, hogy ez nem garantálja az összes memória visszaigényét.

A következőre vonatkozik:

Ez a cikk a következőkre is vonatkozik:

  • Microsoft Visual Basic .NET (minden kiadás)

  • Microsoft Visual C# .NET (minden kiadás)

  • Microsoft Office 2016 (minden kiadás)

  • Microsoft Office 2013 (minden kiadás)

További segítségre van szüksége?

További lehetőségeket szeretne?

Fedezze fel az előfizetés előnyeit, böngésszen az oktatóanyagok között, ismerje meg, hogyan teheti biztonságossá eszközét, és így tovább.

A közösségek segítségével kérdéseket tehet fel és válaszolhat meg, visszajelzést adhat, és részletes ismeretekkel rendelkező szakértőktől hallhat.

Hasznos volt ez az információ?

Mennyire elégedett a fordítás minőségével?
Mi volt hatással a felhasználói élményére?
Ha elküldi a visszajelzést, a Microsoft felhasználja azt a termékei és szolgáltatásai továbbfejlesztéséhez. Az informatikai rendszergazda képes lesz ezeket az adatokat összegyűjteni. Adatvédelmi nyilatkozat.

Köszönjük a visszajelzését!

×