لا يتم إنهاء تطبيق office بعد التنفيذ التلقائي من عميل Visual Studio.NET

الأعراض

عند تنفيذ تطبيق 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.WorkbooksoBooks = oExcel.Workbooks
    oBook = oBooks.Add()

  • استخدام System.Runtime.InteropServices.Marshal.ReleaseComObject في تكرار حلقي حتى تقوم بإرجاع 0 عند الانتهاء من استخدام كائن. إنقاص System.Runtime.InteropServices.Marshal.ReleaseComObject يضمن إصدار مكون COM الأساسي بغض النظر عن كيفية حساب المرجع RCW والحلقة عدة مرات إعادة بدء CLR.
  • لتحرير المرجع إلى المتغير، تعيين يساوي المتغير إلى لا شيء أو Null.
  • استخدام أسلوب إنهاء الكائن تطبيق Office لإعلام ملقم إيقاف.

الحالة

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

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

خطوات إعادة إنشاء المشكلة

  1. بتشغيل Visual Studio.NET.
  2. من القائمة ملف ، انقر فوق جديد ومن ثم انقر فوق المشروع. ضمن مشاريع Visual Basic، حدد تطبيق Windows ، وانقر موافق. يتم إنشاء Form1 افتراضياً.
  3. قم بإضافة مرجع إلى مكتبة كائنات Microsoft Excel. للقيام بذلك، اتبع الخطوات التالية:
    1. من القائمة ' مشروع '، انقر فوق إضافة مرجع.
    2. ضمن علامة التبويب " COM "، تحديد موقع "مكتبة كائن" Excel، ومن ثم انقر فوق تحديد.

      لبرنامج Microsoft Excel 2002: مكتبة كائنات Microsoft Excel 10.0

      ملاحظة: إذا كنت لم تفعل ذلك، فمن المستحسن تحميل وتثبيت Microsoft Office XP توافق تجميعات الأساسية (PIAs).

      للحصول على معلومات إضافية حول Office XP PIAs، انقر فوق رقم المقالة التالي لعرضها في "قاعدة المعارف ل Microsoft":

      328912 Microsoft Office XP تجميعات التوافق الأساسية (PIAs) غير متوفرة للتحميل

      مكتبة كائنات 11.0 Microsoft Excel في Microsoft Office Excel 2003:
    3. انقر فوق "موافق" في مربع الحوار إضافة مراجع لقبول التحديدات.
  4. من القائمة عرض ، انقر فوق مربع الأدوات، ومن ثم اسحب عنصر تحكم زر إلى Form1.
  5. انقر نقراً مزدوجاً فوق Button1. يظهر إطار التعليمات البرمجية للنموذج.
  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.Marshal.FinalReleaseComObject بدلاً من الوقت تكرار استدعاء System.Runtime.InteropServices.Marshal.ReleaseComObject لتحقيق نفس النتيجة.

استكشاف الأخطاء وإصلاحها

لاحظ أنه إذا تم اتباع الخطوات الموضحة في القسم "خطوات لإعادة إنشاء السلوك"، ولا يزال عدم إيقاف تشغيل الملقم، يمكنك استخدام GC. Collect() GC والأسلوب. WaitForPendingFinalizers() أسلوب بعد إطلاق كائن آخر. لأن وقت التشغيل يقوم المهملة في RCW GC. Collect() يفرض جامع البيانات المهملة لتشغيل أسلوب وقد حرر أية مراجع بقي RCW. النشرة المصورة العمومية . Collect() يحاول أن أسلوب استرجاع الحد الأقصى الذاكرة المتوفرة. لاحظ أن ذلك لا يضمن استعادة الذاكرة بالكامل.
خصائص

رقم الموضوع: 317109 - آخر مراجعة: 19‏/01‏/2017 - المراجعة: 1

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

تعليقات