Tuesday 23 January 2018

Gethrforexception - ioexception ومتى و محاولة


لدي بعض رمز إو الذي يقرأ تيار داخل محاولة ..catch. فإنه يمسك إوكسيبتيون ويدعو System. Runtime. InteropServices. Marshal. GetHRForException () داخل الصيد، في محاولة لاتخاذ إجراءات مختلفة استنادا إلى هريسولت. شيء من هذا القبيل: ولكن تشغيل هذه التعليمات البرمجية داخل أسب مع تروستميديوم، أحصل على هذا الاستثناء: بعض الأسئلة: أعتقد أن الاستثناء يحدث لأن جيثرفوريكسيبتيون يدعو إلى التعليمات البرمجية غير المدارة، والتي لا يسمح في الثقة المتوسطة. تصحيح يتم طرح هذا الاستثناء، وليس في وقت تنفيذ جيثرفوريكسيبتيون، ولكن في الوقت الذي يتم جيتد الأسلوب - الصحيح (ستاكتريس يظهر طريقة بلدي، ولكن أنا 99 على وجه التحديد أن استثناء إو لم يحدث) إذا كان الأمر كذلك، هل هناك طريقة بالنسبة لي لتغيير السلوك في بيئة الثقة الجزئية، حتى أنني لا أدعو جيثرفوريكسيبتيون (رمز غير مدار) حيث لا يسمح به وبعبارة أخرى، كيف يمكنني السماح جيت لتحقيق النجاح في وقت الترجمة، في حين أيضا تقييم في وقت التشغيل ما إذا كانت التعليمات البرمجية يجب استدعاء جيثرفوريكسيبتيون () شيء من هذا القبيل: أعتقد أن هناك آلية وقت التشغيل لاختبار إذا كانت الأذونات المتاحة، ولكن لم يكن قادرا على العثور عليه. تصحيح . هل هذه المادة بلوق الجواب شونفا مايكروسوفت يقول أنك لا تستطيع أن تفعل محاولة. (سيكوريتيكسسيبتيون) حول طريقة محمية بواسطة لينكديماند. إذا تم استدعاء ميثودا () ميثودب () و ميثودب () مع لينكديماند للحصول على ثقة كاملة، ثم يتم تحديد لينكديماند مع ميثودا يتم جيتد. لذلك لتجنب سيكوريتيكسسيبتيون، أحتاج إلى استخراج Marshal. GetHRForException إلى طريقة منفصلة. هل هذا الصحيح تطبيقي على التعليمات البرمجية، ميثودا () قد تكون التعليمات البرمجية التي تستدعي القراءة، ثم في الصيد يحاول الاتصال جيثرفوريكسيبتيون (). جيثرفوريكسيبتيون هو ميثودب (). يتم تقييم لينكديماند عندما ميثودا () هو جيتد. (هذا لينكديماند فشل في بلدي سيناريو أسب متوسطة الثقة). إذا قمت بنقل جيثرفوريكسيبتيون إلى طريقة جديدة ميثودك ()، و مشروط استدعاء ميثودك () فقط بعد إذن حتمي. ديماند () ينجح، نظريا يجب أن تكون قادرة على تجنب سيكوريتيكسسيبتيون في وقت جيت لأن ميثودك () سيكون جيتد فقط بعد إذن. الرئيسي () ينجح. طلب 12 يوليو 09 في 14:20 الطريقة المطلوبة هي SecurityPermission. IsUnrestrict (). وهي ترجع خطأ أو خطأ يشير إلى ما إذا كان الإذن مسموحا أم لا. أنها لا تتطلب إذن، كما يفعل SecurityPermission. Demand (). يمكنني استخدام إيسونريستكتد مع SecurityPermissionFlag. UnmanagedCode لمعرفة ما إذا كان يسمح للجمعية استدعاء التعليمات البرمجية غير المدارة ثم قم باستدعاء التعليمات البرمجية غير المدارة فقط إذا سمح. هناك تطور إضافي واحد. يقوم مترجم جيت، عند تجميع طريقة، بالتحقق من كونديكاتسبرميسيون لينكديماندس على أي طريقة تسمى بلدي طريقة ليتم تجميعها. يتم وضع علامة Marshal. GetHRForException () مع لينكديماند. وبالتالي، سوف الأسلوب الذي يدعو Marshal. GetHRForException () رمي سيكوريسيكسيبتيون غير قابل للتغيير في وقت جيت تجميع عندما تعمل في بيئة مقيدة مثل أسب مع الثقة المتوسطة. لذلك، يجب علينا أبدا جيت الأسلوب الذي يدعو Marshal. GetHRForException () في هذه الحالة، مما يعني أنني بحاجة إلى كسر Marshal. GetHRForException () إلى طريقة منفصلة في التعليمات البرمجية التي تسمى (وبالتالي جيتد) فقط عندما أونماناجيدكود هو غير مقيدة. هيريس بعض الأمثلة رمز: أجاب 20 يوليو 09 في 17:56 نعم - الثقة المتوسطة لن تسمح المكالمات إلى رمز غير مدار. مستوى الثقة الوحيد الذي يسمح لها هو الثقة الكاملة. هذا يعتمد. يمكن أن تحدث متطلبات كاس في وقت التشغيل، ولكن بيئة الاستضافة يمكن أن تذهب أيضا على وجوههم والبحث عن الأشياء التي لا يمكن القيام به. يمكنك اختبار لمعرفة ما إذا كان يمكنك إجراء مكالمة إلى التعليمات البرمجية غير المدارة باستخدام طلب كاس مع مثيل سيكوريتيبرميسيون. رمز لجعل الطلب كاس يشبه هذا الرد أجاب 12 يوليو 09 في 14:32 حسنا، وهذا هو معلومات كبيرة. وهذا يغطي الجزء ب من Q3. ولكن ماذا عن جزء كيف يمكنني الحصول على تجميع جيت للنجاح هل يمكنني وضع علامة على الأسلوب الخاص بي مع سمة أمان أو. تذكر، نظريتي هي أن خطأ سيكوريتيبرميسيون لا يحدث في وقت التشغيل، فإنه يحدث خلال جيت - وأعتقد أنك أكدت أن هذا ممكن. لذا فإن السؤال هو، كيف يمكنني كتابة التعليمات البرمجية للسماح جيت لجمع. نداش تشيسو يوليو 12 09 في 15:50 ينبغي أن يحدث في وقت التشغيل، وإلا فإن التجمع لن حتى 39t تحميل - ولكي يحدث هذا التجمع يحتاج إلى وضع علامة على أنها تتطلب الإذن. حتى ذلك الحين أن 39s يمكن التحقق من وقت التشغيل، كما سيحدث على تحميل التجمع، والتي يمكن أن تكون في وقت التشغيل. نداش بلودارت يوليو 12 09 في 16:24 نوع مختلف من الاختيار، مطالب الارتباط هي سمات على طريقة، ويتم التحقق في الواقع في وقت جيت. It39s تستخدم كثيرا من قبل الإطار نفسه و it39s نادرة لرؤيته خارج مصدر كلر. ما أظهره هو مطلب حتمي، وليس إعلانية مثل سيكوريتبيرميسيون (SecurityAction. LinkDemand، صحيح غير مقيد) نداش بلودارت يوليو 12 09 في 18: 55 وضع معا في جميع الأقسام السابقة وصف كيفية بناء محاولة. قبض على. وأخيرا كتل التعليمات البرمجية لطريقة وريليست في فئة ليستوفنومبرز. الآن، Let39s المشي من خلال رمز والتحقيق في ما يمكن أن يحدث. عند وضع كافة المكونات معا، تبدو طريقة وريتينليست كما يلي. كما ذكر سابقا، هذه الطريقة 39s محاولة كتلة ثلاثة احتمالات خروج مختلفة هنا اثنان منهم. يفشل في التعليمات البرمجية في محاولة ويلقي استثناء. يمكن أن يكون هذا إوكسيبتيون الناجم عن عبارة فيلوريتر جديدة أو إندكسوتوفوندزكسيبتيون الناجمة عن قيمة فهرس خاطئة في ل لوب. كل شيء ينجح ويخرج بيان المحاولة بشكل طبيعي. Let39s ننظر إلى ما يحدث في طريقة وريتينليست خلال هذين الاحتمالين الخروج. السيناريو 1: يحدث استثناء يمكن أن تفشل العبارة التي تقوم بإنشاء فيلوريتر لعدد من الأسباب. على سبيل المثال، منشئ فيلوريتر يلقي إوكسيبتيون إذا كان البرنامج لا يمكن إنشاء أو الكتابة إلى الملف المشار إليه. عندما يلقي فيلوريتر إوكسيبتيون. نظام وقت التشغيل يتوقف فورا تنفيذ محاولة محاولة كتلة المكالمات التي يتم تنفيذها لم تكتمل. ثم يبدأ نظام التشغيل في البحث في الجزء العلوي من كومة استدعاء الأسلوب لمعالج استثناء مناسب. في هذا المثال، عند حدوث إوكسيبتيون، منشئ فيليوريتر في أعلى كومة المكالمة. ومع ذلك، لا يملك منشئ فيليوريتر معالج استثناء المناسب، وبالتالي يقوم نظام التشغيل بفحص الأسلوب التالي 151 طريقة وريتينليست 151 في كومة استدعاء الأسلوب. يحتوي أسلوب وريتينليست على معالجين استثناء: واحد ل إوكسيبتيون وواحد ل إندكسوتوفوندزكسيبتيون. يقوم نظام التشغيل بالتحقق من كتابة معالجات 39s بالترتيب الذي تظهر به بعد بيان المحاولة. الحجة إلى معالج الاستثناء الأول هو إندكسوتوفوندزكسيبتيون. هذا لا يتطابق مع نوع الاستثناء القيت، وبالتالي فإن نظام التشغيل التحقق من معالج الاستثناء التالي 151 إوكسيبتيون. يطابق ذلك نوع الاستثناء الذي تم طرحه، وبالتالي ينتهي نظام وقت التشغيل من البحث عن معالج استثناء مناسب. الآن بعد أن وجد وقت التشغيل معالج المناسبة، يتم تنفيذ التعليمات البرمجية في هذه الكتلة الصيد. بعد تنفيذ معالج الاستثناء، نظام وقت التشغيل يمرر السيطرة إلى كتلة أخيرا. رمز في كتلة أخيرا ينفذ بغض النظر عن الاستثناء اشتعلت فوقه. في هذا السيناريو، لم يتم فتح فيلوريتر أبدا ولا تحتاج إلى إغلاق. بعد انتهاء التشطيبات أخيرا تنفيذ، يستمر البرنامج مع البيان الأول بعد كتلة أخيرا. Here39s الإخراج الكامل من برنامج ليستوفنومبرز الذي يظهر عند إوكسيبتيون طرح. يظهر رمز جريئة في القائمة التالية البيانات التي يتم تنفيذها خلال هذا السيناريو: السيناريو 2: محاولة كتلة إنهاء بشكل طبيعي في هذا السيناريو، كافة العبارات ضمن نطاق كتلة محاولة تنفيذ بنجاح ورمي أي استثناءات. التنفيذ يقع قبالة نهاية كتلة المحاولة، ونظام التشغيل يمر السيطرة إلى كتلة أخيرا. لأن كل شيء كان ناجحا، برينتوريتر مفتوح عندما يصل التحكم إلى كتلة أخيرا، الذي يغلق برينتوريتر. مرة أخرى، بعد إنهاء التشطيبات أخيرا تنفيذ، يستمر البرنامج مع البيان الأول بعد كتلة أخيرا. هنا هو الإخراج من برنامج ليستوفنومبرز عندما لا يتم طرح أي استثناءات. يظهر رمز غامق في العينة التالية البيانات التي يتم تنفيذها خلال هذا السيناريو.

No comments:

Post a Comment