سؤال

أنا أستخدم كائن COM (MODI) من داخل تطبيق .NET الخاص بي. الطريقة التي أتصل بها ترمي نظامًا. AccessViolationException ، والذي يتم اعتراضه بواسطة Visual Studio. الشيء الغريب هو أنني قمت بلفت مكالمتي في تجربة ، والتي تضم معالجات للوصول إلى AccessViolationException ، و comexception وكل شيء آخر ، ولكن عندما يعترض Visual Studio (2010) على AccessViolationException ، فإن مصحح الأخطاء ينفصل عن استدعاء الطريقة (doc.ocr) ، وإذا خطت ، فإنه يستمر في السطر التالي بدلاً من إدخال كتلة الصيد. بالإضافة إلى ذلك ، إذا قمت بتشغيل هذا خارج استوديو Visual Studio تعطل طلبي. كيف يمكنني التعامل مع هذا الاستثناء الذي يتم إلقاؤه داخل كائن COM؟

MODI.Document doc = new MODI.Document();
try
{
    doc.Create(sFileName);
    try
    {
        doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, false, false);
        sText = doc.Images[0].Layout.Text;
    }
    catch (System.AccessViolationException ex)
    {
        //MODI seems to get access violations for some reason, but is still able to return the OCR text.
        sText = doc.Images[0].Layout.Text;
    }
    catch (System.Runtime.InteropServices.COMException ex)
    {
        //if no text exists, the engine throws an exception.
        sText = "";
    }
    catch
    {
        sText = "";
    }

    if (sText != null)
    {
        sText = sText.Trim();
    }
}
finally
{
    doc.Close(false);

    //Cleanup routine, this is how we are able to delete files used by MODI.
    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(doc);
    doc = null;
    GC.WaitForPendingFinalizers();
    GC.Collect();
    GC.WaitForPendingFinalizers();

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

المحلول

في .NET 4.0 ، يتعامل وقت التشغيل مع بعض الاستثناءات التي أثيرت كأخطاء في معالجة الأخطاء المنظمة للنوافذ (SEH) كمؤشرات للحالة التالفة. لا يُسمح لاستثناءات الحالة التالفة هذه (CSE) بالقبض عليها من قبل الرمز المدار القياسي. لن دخل في السبب أو كيف هو هنا. اقرأ هذا المقال حول CSE's في إطار .NET 4.0:

http://msdn.microsoft.com/en-us/magazine/dd419661.aspx#id0070035

لكن هناك أمل. هناك بعض الطرق للالتفاف على هذا:

  1. Recompile كتجميع .NET 3.5 وتشغيله في .NET 4.0.

  2. أضف سطرًا إلى ملف التكوين الخاص بالتطبيق تحت عنصر التكوين/وقت التشغيل:<legacyCorruptedStateExceptionsPolicy enabled="true|false"/>

  3. تزيين الأساليب التي تريد التقاط هذه الاستثناءات مع HandleProcessCorruptedStateExceptions ينسب. نرى http://msdn.microsoft.com/en-us/magazine/dd419661.aspx#id0070035 للتفاصيل.


تعديل

في السابق ، أشرت المنتدى بوست للحصول على تفاصيل إضافية. ولكن نظرًا لأن Microsoft Connect قد تقاعدت ، فإليك التفاصيل الإضافية في حالة اهتمامك:

من Gaurav Khanna ، مطور من فريق Microsoft CLR

هذا السلوك حسب التصميم بسبب ميزة CLR 4.0 تسمى استثناءات الحالة الفاسدة. ببساطة ، لا ينبغي أن تقوم التعليمات البرمجية المدارة بمحاولة لالتقاط استثناءات تشير إلى حالة العملية التالفة و AV هي واحدة منها.

ثم يمضي للرجوع إلى الوثائق على GenalProcessCorruptedStateExceptionSattribute والمقال أعلاه. يكفي القول ، إنه بالتأكيد يستحق القراءة إذا كنت تفكر في التقاط هذه الأنواع من الاستثناءات.

نصائح أخرى

أضف ما يلي في ملف التكوين ، وسيتم اكتشافه في Try Catch Block. كلمة الحذر ... حاول تجنب هذا الموقف ، لأن هذا يعني نوعًا من الانتهاك يحدث.

<configuration>
   <runtime>
      <legacyCorruptedStateExceptionsPolicy enabled="true" />
   </runtime>
</configuration>

تم تجميعها من الإجابات المذكورة أعلاه ، عملت بالنسبة لي ، وتبعت خطوات للقبض عليها.

الخطوة رقم 1 - أضف المقتطف التالي لتكوين ملف

<configuration>
   <runtime>
      <legacyCorruptedStateExceptionsPolicy enabled="true" />
   </runtime>
</configuration>

الخطوة 2

يضيف -

[HandleProcessCorruptedStateExceptions]

[SecurityCritical]

في الجزء العلوي من الوظيفة ، تقوم بربط الاستثناء

مصدر: http://www.gisremotesensing.com/2017/03/catch-exception-attempted-to-read-or.html

يمكنك محاولة استخدام appdomain.unhandledException ومعرفة ما إذا كان هذا يتيح لك التقاطه.

**تعديل*

هنا بعض معلومات اكثر قد يكون ذلك مفيدًا (إنها قراءة طويلة).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top