CIL:"عملية زعزعة استقرار وقت التشغيل" استثناء
-
03-07-2019 - |
سؤال
لقد لعب مع PostSharp قليلا و أنا واجهت مشكلة سيئة.
بعد IL في سيلفرلايت الجمعية:
.method public hidebysig specialname newslot virtual final instance void
set_AccountProfileModifiedAt(valuetype [mscorlib]System.DateTime 'value') cil managed
{
.maxstack 2
.locals (
[0] bool ~propertyHasChanged,
[1] bool CS$4$0000)
L_0000: nop
L_0001: nop
L_0002: ldarg.0
L_0003: call instance valuetype [mscorlib]System.DateTime
Accounts.AccountOwner::get_AccountProfileModifiedAt()
L_0008: ldarg.1
L_0009: call bool [mscorlib]System.DateTime::op_Inequality(valuetype
[mscorlib]System.DateTime, valuetype [mscorlib]System.DateTime)
L_000e: stloc.0
L_000f: ldarg.0
L_0010: ldarg.1
L_0011: stfld valuetype [mscorlib]System.DateTime
Accounts.AccountOwner::accountProfileModifiedAt
L_0016: br.s L_0018
L_0018: ldloc.0
L_0019: ldc.i4.0
L_001a: ceq
L_001c: stloc.1
L_001d: ldloc.1
L_001e: brtrue.s L_002b
L_0020: ldarg.0
L_0021: ldstr "AccountProfileModifiedAt"
L_0026: call instance void
Accounts.AccountOwner::NotifyPropertyChanged(string)
L_002b: nop
L_002c: leave.s L_002e
L_002e: ret
}
يطلق النظام.الأمن.VerificationException:العملية يمكن أن يزعزع استقرار وقت التشغيل.الاستثناء.عاكس يوزع هذا موافق.ما يمكن أن يكون الخطأ في ذلك ؟
تحديث 1 وتهدف إلى العمل على النحو التالي:
public void set_AccountProfileModifiedAt(DateTime value)
{
bool propertyHasChanged = this.AccountProfileModifiedAt != value;
this.accountProfileModifiedAt = value;
if (propertyHasChanged)
{
this.NotifyPropertyChanged("AccountProfileModifiedAt");
}
}
تحديث 2 أحصل على تحديد استثناء داخل واضعة نفسها
تحديث 3 مما يجعل غير ثابت المكالمات callvirt (NotifyPropertyChanged) لا يساعد
تحديث 4 التعليق (لأغراض الاختبار) كود:
L_0018: ldloc.0
L_0019: ldc.i4.0
L_001a: ceq
L_001c: stloc.1
L_001d: ldloc.1
واستبدال L_001e:brtrue.s L_002b مع L_001e:br.s L_002b لا حيلة لكنها عودة غير مشروطة - ليس ما أريد.
تحديث 5 إذا كنت تستخدم C# compiler إلى تقليد السلوك المطلوب (أنا لا تزال بحاجة إلى أن تفعل ذلك مع Postsharp) أحصل التالية IL:
.method public hidebysig specialname newslot virtual final instance void
set_AccountProfileModifiedAt(valuetype [mscorlib]System.DateTime 'value') cil managed
{
.maxstack 2
.locals init (
[0] bool val,
[1] bool CS$4$0000)
L_0000: nop
L_0001: ldarg.0
L_0002: call instance valuetype [mscorlib]System.DateTime
Accounts.AccountOwner::get_AccountProfileModifiedAt()
L_0007: ldarg.1
L_0008: call bool [mscorlib]System.DateTime::op_Inequality(valuetype
[mscorlib]System.DateTime, valuetype [mscorlib]System.DateTime)
L_000d: stloc.0
L_000e: ldarg.0
L_000f: ldarg.1
L_0010: stfld valuetype [mscorlib]System.DateTime
Accounts.AccountOwner::accountProfileModifiedAt
L_0015: ldloc.0
L_0016: ldc.i4.0
L_0017: ceq
L_0019: stloc.1
L_001a: ldloc.1
L_001b: brtrue.s L_0029
L_001d: ldarg.0
L_001e: ldstr "AccountProfileModifiedAt"
L_0023: call instance void
Accounts.AccountOwner::NotifyPropertyChanged(string)
L_0028: nop
L_0029: ret
}
ملاحظة هناك اختلافات طفيفة إضافية br.s القفز في L_0016 و غريبة تقفز L_001e:brtrue.s L_002b.في مترجم نسخة أحصل على القفز مباشرة إلى المؤسسة.
المحلول
هل استخدام peverify?يجب دائما تشغيل هذه الأداة المساعدة عند اللعب مباشرة مع MSIL (يمكنك استخدام msbuild العلم /ص:PostSharpVerify=true).
ابحث في التعليمات البرمجية الخاصة بك:
المتغيرات المحلية الخاصة بك لم يتم تهيئة (عداد المفقودين "init" الكلمة).هذا هو خاصية من MethodBodyDeclaration.
كنت تستخدم 'ترك' بدلا من 'أحزاب اللقاء المشترك للخروج من محمية كتلة ؛ هذا لا طائل منه ولكن يجب أن لا يهم.
حظا سعيدا ،
-جايل
نصائح أخرى
فمن الصعب أن نقول - هل لديك كومة أثر ؟ هذا الاستثناء هو عادة عندما القيت CLR غير قادر على التحقق من نوع-السلامة من التعليمات البرمجية الخاصة بك.كما يمكن أن تأتي من هذا القانون أو من أي من الطرق أو أنواع تستخدمه سيكون من الصعب أن نقول ما هي القضية دون تتبع المكدس.
هنا بعد أن تتعامل مع هذا الخطأ.أنا لا أعرف إذا كان لديك حالة خاصة بسبب نفس المشكلة ، ولكن بشكل عام يبدو أن هذا له علاقة مع أمان الوصول إلى التعليمات البرمجية والتحقق.إذا كان هذا هو الحال, عاكس سوف تكون قادرا على قراءة IL على ما يرام ولكن CAS نظام ركلة بها لأسباب غير معروفة.
يبدو أن لديك خاصية اضع الدعوة إلى مجموعة من الكائنات الأخرى.عليك أن تذهب من خلال هذه الطريقة المكالمات تبحث عن التحول الكبير البيانات في حالة محددة المسألة المذكورة في ما بعد.