الأعراض
عند أتمتة تطبيق Microsoft Office من Microsoft Visual Basic .NET أو Microsoft Visual C# .NET، لا يتم Office التطبيق عند استدعاء الأسلوب إنهاء.
السبب
عندما Visual Studio .NET كائن COM من التعليمات البرمجية المدارة، فإنه ينشئ تلقائيا "التفاف قابل للتسميات في وقت التشغيل" (RCW). يعارض RCW المكالمات بين تطبيق .NET و كائن COM. يحتفظ RCW بإحصاء مرجعي لكائن COM. وبالتالي، إذا لم يتم إصدار كل المراجع على RCW، لا يتم إنهاء كائن COM.
الحل
للتأكد من إنهاء Office التطبيق، حدد ما إذا كانت التعليمات البرمجية التلقائية تفي بالمعايير التالية:
-
تعريف كل كائن كمتغير جديد. على سبيل المثال، تغيير السطر التالي من التعليمات البرمجية:
oBook = oExcel.Workbooks.Add()
غير ذلك إلى ما يلي:
dim oBooks as Excel.Workbooks oBooks = oExcel.Workbooks oBook = oBooks.Add()
-
استخدم System.Runtime.InteropServices.بعد ذلك.ReleaseComObject في حلقة مستمرة حتى يتم إرجاع 0 عند الانتهاء من استخدام كائن. يقوم System.Runtime.InteropServices.أوام.ReleaseComObject بفك حساب المرجع ل RCW، كما تعمل الحلقة على التأكد من إصدار مكون COM الأساسي بغض النظر عن عدد المرات التي تم فيها إعادة إدخاله في CLR.
-
للافراج عن المرجع إلى المتغير، قم بتعيين المتغير يساوي لا شيء أو Null.
-
استخدم الأسلوب إنهاء الخاص Office التطبيق لإخبار الخادم بإيقاف التشغيل.
الحالة
هذا السلوك مرتبط بالتصميم.
مزيد من المعلومات
خطوات لإعادة إنتاج السلوك
-
ابدأ Visual Studio .NET.
-
في القائمة ملف، انقر فوق جديد، ثم انقر فوق Project. ضمن Visual Basic المشاريع، حدد Windows التطبيق، ثم انقر فوق موافق.
ملاحظة يتم إنشاء Form1 بشكل افتراضي. -
أضف مرجعا إلى Microsoft Excel الكائن. للقيام بذلك، اتبع الخطوات التالية:
-
في القائمة Project، انقر فوق إضافة مرجع.
-
على علامة التبويب COM، حدد موقع مكتبة الكائنات Excel، ثم انقر فوق تحديد.
بالنسبة Microsoft Excel 2002: Microsoft Excel 10.0 Object LibraryNote إذا لم تكن قد فعلت ذلك بعد، نوصي بتنزيل تجميعات XP الأساسية للتجميعات المتداخلة الأساسية ل Microsoft Office (PIAs) وتثبيتها. لمزيد من المعلومات حول Office XP PIAs، انتقل إلى مقالة قاعدة معارف Microsoft التالية:328912 Microsoft Office تجميعات XP الأساسية (PIAs) للتنزيل بالنسبة Microsoft Office Excel 2003: Microsoft Excel 11.0 Object Library
-
انقر فوق موافق في مربع الحوار إضافة مراجع لقبول التحديدات.
-
-
في القائمة عرض، انقر فوق مربع الأدوات، ثم اسحب عنصر تحكم الزر إلى النموذج 1.
-
انقر نقرا مزدوجا فوق الزر1.
ملاحظة تظهر نافذة التعليمات البرمجية للشكل. -
أضف التعليمة البرمجية التالية إلى أعلى Form1.vb:
Imports Microsoft.Office.Interop
-
استبدل التعليمات البرمجية التالية في نافذة التعليمات البرمجية:
Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click 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 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
-
اضغط على F5 لتشغيل التطبيق.
-
افتح Windows إدارة المهام. في Visual Studio، اعرض نافذة الإخراج لرؤية رسائل تصحيح الأخطاء. انقر فوق زر الأمر. لاحظ ظهور مثيل Excel.exe في القائمة عمليات.
-
لا يزال مثيل Excel قيد التشغيل في قائمة المهام حتى بعد انتهاء التطبيق من النوم. أغلق مربع الحوار ولاحظ أن Excel تظهر في القائمة عمليات.
-
عند تنفيذ الخطوات في المقطع "الدقة"، Office التطبيق بعد إصدار المتغير الأخير. استبدل الدالة في الخطوة 5 باستخدام التعليمات البرمجية التالية:
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، فراجع التعليمة البرمجية للدالة NAR() :
private void NAR(object o)
{
try
{
while (System.Runtime.InteropServices.Marshal.ReleaseComObject(o) > 0) ;
}
catch {}
finally
{
o = null;
}
}
ملاحظة بدءا من .NET Framework 2.0، يمكنك استخدام System.Runtime.InteropServices.وقدر.FinalReleaseComObject بدلا من استدعاء حلقة أثناء الاتصال System.Runtime.InteropServices.بعد ذلك.ReleaseComObject لتحقيق النتيجة نفسها.
استكشاف الأخطاء وإصلاحها
ملاحظة يتم إصدار Acrobat Reader من قِبل شركة Adobe Systems Inc.. إذا كنت تتبع الخطوات الموضحة في المقطع "خطوات إعادة إنتاج السلوك"، ولم يتم إيقاف تشغيل الخادم بعد، يمكنك استخدام GC. طريقة Collect() وطريقة GC. الأسلوب WaitForPendingFinalizers() بعد تحرير الكائن الأخير. نظرا لأن وقت التشغيل ينفذ تجميع البيانات المهملة على RCW، فإن GC. تقوم طريقة Collect() بشغل سلة المهملات وقد تصدر أي مراجع لا يزال RCW بها. The GC. تحاول طريقة Collect() استعادة الحد الأقصى للذاكرة المتوفرة. لاحظ أن هذا لا يضمن استعادة كل الذاكرة.
ينطبق على
تنطبق هذه المقالة أيضا على:
-
Microsoft Visual Basic .NET (كل الإصدارات)
-
Microsoft Visual C# .NET (كل الإصدارات)
-
Microsoft Office 2016 (كل الإصدارات)
-
Microsoft Office 2013 (كل الإصدارات)