Sunday 4 February 2018

Gethrforexception


لدي بعض رمز إو الذي يقرأ تيار داخل محاولة ..catch. فإنه يمسك إوكسيبتيون ويدعو System. Runtime. InteropServices. Marshal. GetHRForException () داخل الصيد، في محاولة لاتخاذ إجراءات مختلفة استنادا إلى هريسولت. شيء من هذا القبيل: ولكن تشغيل هذا الرمز داخل ASP. NET مع تروستميديوم، أحصل على هذا الاستثناء: سؤالين: أعتقد أن الاستثناء يحدث لأن جيثرفوريكسيبتيون يدعو إلى التعليمات البرمجية غير المدارة، والتي لا يسمح في الثقة المتوسطة. تصحيح يتم طرح هذا الاستثناء، وليس في وقت تنفيذ جيثرفوريكسيبتيون، ولكن في الوقت الذي يتم جيتد الأسلوب - الصحيح (ستاكتريس يظهر طريقة بلدي، ولكن أنا 99 على وجه التحديد أن استثناء إو لم يحدث) إذا كان الأمر كذلك، هل هناك طريقة بالنسبة لي لتغيير السلوك في بيئة الثقة الجزئية، حتى أنني لا أدعو جيثرفوريكسيبتيون (رمز غير مدار) حيث لا يسمح به وبعبارة أخرى، كيف يمكنني السماح جيت لتحقيق النجاح في وقت الترجمة، في حين أيضا تقييم في وقت التشغيل ما إذا كانت التعليمات البرمجية يجب استدعاء جيثرفوريكسيبتيون () شيء من هذا القبيل: أعتقد أن هناك آلية وقت التشغيل لاختبار إذا كانت الأذونات المتاحة، ولكن لم يكن قادرا على العثور عليه. تصحيح . هل هذه المادة بلوق الجواب شونفا مايكروسوفت يقول أنك لا تستطيع أن تفعل محاولة. (سيكوريتيكسسيبتيون) حول طريقة محمية بواسطة لينكديماند. إذا تم استدعاء ميثودا () ميثودب () و ميثودب () مع لينكديماند للحصول على ثقة كاملة، ثم يتم تحديد لينكديماند مع ميثودا يتم جيتد. لذلك لتجنب سيكوريتيكسسيبتيون، أحتاج إلى استخراج Marshal. GetHRForException إلى طريقة منفصلة. هل هذا الصحيح تطبيقي على التعليمات البرمجية، ميثودا () قد تكون التعليمات البرمجية التي تستدعي القراءة، ثم في الصيد يحاول الاتصال جيثرفوريكسيبتيون (). جيثرفوريكسيبتيون هو ميثودب (). يتم تقييم لينكديماند عندما ميثودا () هو جيتد. (هذا لينكديماند فشل في بلدي المتوسطة الثقة ASP. NET سيناريو). إذا قمت بنقل جيثرفوريكسيبتيون إلى طريقة جديدة ميثودك ()، و مشروط استدعاء ميثودك () فقط بعد إذن حتمي. ديماند () ينجح، نظريا يجب أن تكون قادرة على تجنب سيكوريتيكسسيبتيون في وقت جيت لأن ميثودك () سيكون جيتد فقط بعد إذن. الرئيسي () ينجح. طلب 12 يوليو 09 في 14:20 الطريقة المطلوبة هي SecurityPermission. IsUnrestrict (). وهي ترجع خطأ أو خطأ يشير إلى ما إذا كان الإذن مسموحا أم لا. أنها لا تتطلب إذن، كما يفعل SecurityPermission. Demand (). يمكنني استخدام إيسونريستكتد مع SecurityPermissionFlag. UnmanagedCode لمعرفة ما إذا كان يسمح للجمعية استدعاء التعليمات البرمجية غير المدارة ثم قم باستدعاء التعليمات البرمجية غير المدارة فقط إذا سمح. هناك تطور إضافي واحد. يقوم مترجم جيت، عند تجميع طريقة، بالتحقق من كواداشسبرميسيون لينكديماندس على أي طريقة تسمى بلدي طريقة ليتم تجميعها. يتم وضع علامة Marshal. GetHRForException () مع لينكديماند. وبالتالي، سوف الأسلوب الذي يدعو Marshal. GetHRForException () رمي سيكوريسيكسيبتيون غير قابل للتغيير في وقت جيت تجميع عندما تعمل في بيئة مقيدة مثل ASP. NET مع ثقة متوسطة. لذلك، يجب علينا أبدا جيت الأسلوب الذي يدعو 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: 55Marshhal. GetHRForException لا أكثر من مجرد الحصول على الموارد البشرية للاستثناء Let8217s تبدأ أولا من خلال النظر في مقتطف رمز صغير: هذا يبدو على ما يرام تماما، والحق ليس حقا. اتضح أن هذا أبي هو في الواقع سيئة اسمه، وأنه في الواقع لا أكثر من مجرد استرداد الموارد البشرية من كائن الاستثناء. استخدام هذا أبي بشكل غير صحيح يمكن أن تعطيك بعض المشاكل الغريبة، مثل رمي استثناء غير صحيح القديمة. لذلك ما تفعل أبي فعليا إلى جانب العودة لك هريسولت، هذه الوظيفة أيضا تعيين كائن إيرورينفو الموضوع الحالي ليكون كائن استثناء. يحتوي كل مؤشر ترابط كائن إير إيرينفو كوم أسيساتد، مع التخلف إلى نول. يمثل هذا الكائن إرورينفو الفشل من آخر دعوة أبي كوم، وهو نوع من مثل أبي Win32 جيتلاستيرور () أبي، أو إرنو C أبي. من كائن إيرورينفو، يمكنك الحصول على مزيد من المعلومات مثل وصف الخطأ، سياق ملف التعليمات، الخ، التي تعطيك المزيد من المعلومات حول الخطأ. عن طريق تعيين كائن إرورينفو إلى كائن الاستثناء (في الواقع الإعداد إلى تنفيذ إرورينفو كائن الاستثناء، الذي تتم مشاركته من قبل كافة الكائنات المدارة)، فإنك تقول أساسا المتصلين كوم الخاص بك، كوثي، هناك فشل، it8217s هذا الكائن الاستثناء، و يجب أن تفعل شيئا عن إيتكوت، والتي من الواضح فكرة سيئة إذا كنت تريد فقط لاسترداد الموارد البشرية. في كثير من الحالات، هذا يمكن أن تذهب دون أن يلاحظها أحد، إذا كان لديك كوم كاليركالي يعالج إرورينفو بشكل صحيح. بواسطة كوتوريكتليكوت أعني أنها تتبع بروتوكول كوم إيرورينفو، التي هي أساسا: 1. استخدام المتصل إرورينفو من مؤشر الترابط الحالي عند استدعاء واجهة كوم التي تقول إكسليلي دعم كاتي إيرورينفوكوت 2. المستدعي (الذي ينفذ واجهة كوم) التي تقول دعم كوتي إيرورينفوكوت، يجب مسح إيرورينفو قبل عودته. هذا مشابه جدا ل جيتلاستيرور () إرنو، يمين إذا كان هذا هو الحال، تعيين بشكل غير صحيح إيرورينفو في مؤشر الترابط، وعادة ما تكون أوفيروريتنكليرد من قبل بعض تنفيذ الواجهة التي تدعم إيرورينفو، أو تجاهلها. ومع ذلك، لأن البروتوكول الذي وصفته هو في الواقع ليست مفهومة بشكل جيد جدا من قبل كل مطور كوم، I8217ve كثيرا ما ينظر الحالات حيث مكون كوم أقول كوتسور، وأنا دعم إيرورينفو على كل كوم إنتيرفاسكوت، وأنها don8217t سيتكلير إيرورينفو على الإطلاق. وبعد ذلك، المتصل من هذه الواجهة كوم سيئة مزعجة، في نهاية المطاف باستخدام إيرورينفو التي حددتها استدعاء جيثرفوريكسيبتيون في وقت سابق، ويؤدي إلى الاعتقاد بأن هناك خطأ. على سبيل المثال، Let8217s النظر في السيناريو التالي: بعض كوم مكون كوم يدعو إلى التعليمات البرمجية. NET التعليمات البرمجية نيت استثناء، ويقول التعليمات البرمجية إوكسيبتيون. صيد الاستثناء، واستدعاء Marshal. GetHRForException، الذي يحدد إرورينفو إلى هذا الاستثناء رمز إوكسيبتيون. NET يستدعي إلى عنصر كوم آخر B، يدعو إلى فشل IB. Func IB. Func وعودة بعض التعليمات البرمجية فشل الموارد البشرية، ويقول يوتوفميموري كلر يرى رمز فشل الموارد البشرية، واطلب من كوم مكون ب دعم إيرورينفوكوت، و B إجابات كوتسور، لماذا نوتكوت ، إلا أنه doesn8217t حقا دعم ذلك و don8217t سيتكلير إرورينفو كلر استرداد إيرورينفو، ويرى أنه في الواقع استثناء المدارة، ويخرج استثناء إوكسيبتيون بدلا من أوتوفميموريكسيبتيون. الآن، قد يكون يتساءل: ما هو أبي المقصود حقا في المقام الأول يتم استخدامه في الواقع في الأماكن في كوم إنتيروب، حيث تريد إرجاع هريسولت وتعيين إيرورينفو من قبل نفسك. هذا don8217t يحدث في كثير من الأحيان 8211 معظم الناس سوف تكون سعيدة بما فيه الكفاية للسماح كوم إنتيروب رعاية هذا الجزء عن طريق تحويل استثناء إلى الموارد البشرية و إيرورينفو (والذي يحدث للاتصال Marshal. GetHRForException). حتى إذا كنت تعرف حقا ما تقومون به، نصيحتي هي البقاء بعيدا عن Marshal. GetHRForException. ماذا لو كنت حقا، حقا تريد فقط الحصول على هريسولت لاستثناء معين يجب استخدام الخاصية Exception. HResult.

No comments:

Post a Comment