راجع المنتجات الأخرى التي تنطبق عليها هذه المقالة.

الأعراض

عند أتمتة تطبيق 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 التطبيق لإخبار الخادم بإيقاف التشغيل.

الحالة

هذا السلوك مرتبط بالتصميم.

مزيد من المعلومات

خطوات لإعادة إنتاج السلوك

  1. ابدأ Visual Studio .NET.

  2. في القائمة ملف، انقر فوق جديد، ثم انقر فوق Project. ضمن Visual Basic المشاريع، حدد Windows التطبيق، ثم انقر فوق موافق.

    ملاحظة يتم إنشاء Form1 بشكل افتراضي.

  3. أضف مرجعا إلى Microsoft Excel الكائن. للقيام بذلك، اتبع الخطوات التالية:

    1. في القائمة Project، انقر فوق إضافة مرجع.

    2. على علامة التبويب 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

    3. انقر فوق موافق في مربع الحوار إضافة مراجع لقبول التحديدات.

  4. في القائمة عرض، انقر فوق مربع الأدوات، ثم اسحب عنصر تحكم الزر إلى النموذج 1.

  5. انقر نقرا مزدوجا فوق الزر1.

    ملاحظة تظهر نافذة التعليمات البرمجية للشكل.

  6. أضف التعليمة البرمجية التالية إلى أعلى Form1.vb:

    Imports Microsoft.Office.Interop
    
  7. استبدل التعليمات البرمجية التالية في نافذة التعليمات البرمجية:

        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
    
  8. اضغط على F5 لتشغيل التطبيق.

  9. افتح Windows إدارة المهام. في Visual Studio، اعرض نافذة الإخراج لرؤية رسائل تصحيح الأخطاء. انقر فوق زر الأمر. لاحظ ظهور مثيل Excel.exe في القائمة عمليات.

  10. لا يزال مثيل Excel قيد التشغيل في قائمة المهام حتى بعد انتهاء التطبيق من النوم. أغلق مربع الحوار ولاحظ أن Excel تظهر في القائمة عمليات.

  11. عند تنفيذ الخطوات في المقطع "الدقة"، 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 (كل الإصدارات)

هل تحتاج إلى مزيد من المساعدة؟

توسيع المهارات
استكشاف التدريب
الحصول على الميزات الجديدة أولاً
الانضمام إلى Microsoft Insider

هل كانت المعلومات مفيدة؟

ما مدى رضاك عن جودة اللغة؟
ما الذي أثّر في تجربتك؟

نشكرك على ملاحظاتك!

×