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
-
Indítsa Visual Studio .NET-t.
-
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. -
Adjon hozzá egy hivatkozást a Microsoft Excel objektumtárhoz. Ezt a következőképpen teheti meg:
-
A Hivatkozás Project kattintson a Hivatkozás hozzáadása elemre.
-
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 -
Kattintson az OK gombra a Hivatkozások hozzáadása párbeszédpanelen a kijelölések elfogadásához.
-
-
A Nézet menüben kattintson az Eszközkészlet elemre, majd húzzon egy gombvezérlőt az Űrlap1 elemre.
-
Kattintson duplán a Gombra1.
Megjegyzés Megjelenik az űrlap kódablaka. -
Adja hozzá a következő kódot az Űrlap1.vb lap tetejéhez:
Imports Microsoft.Office.Interop
-
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
-
Az alkalmazás futtatásához nyomja le az F5 billentyűt.
-
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.
-
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.
-
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)