سؤال

لقد لعب مع 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).

ابحث في التعليمات البرمجية الخاصة بك:

  1. المتغيرات المحلية الخاصة بك لم يتم تهيئة (عداد المفقودين "init" الكلمة).هذا هو خاصية من MethodBodyDeclaration.

  2. كنت تستخدم 'ترك' بدلا من 'أحزاب اللقاء المشترك للخروج من محمية كتلة ؛ هذا لا طائل منه ولكن يجب أن لا يهم.

حظا سعيدا ،

-جايل

نصائح أخرى

فمن الصعب أن نقول - هل لديك كومة أثر ؟ هذا الاستثناء هو عادة عندما القيت CLR غير قادر على التحقق من نوع-السلامة من التعليمات البرمجية الخاصة بك.كما يمكن أن تأتي من هذا القانون أو من أي من الطرق أو أنواع تستخدمه سيكون من الصعب أن نقول ما هي القضية دون تتبع المكدس.

هنا بعد أن تتعامل مع هذا الخطأ.أنا لا أعرف إذا كان لديك حالة خاصة بسبب نفس المشكلة ، ولكن بشكل عام يبدو أن هذا له علاقة مع أمان الوصول إلى التعليمات البرمجية والتحقق.إذا كان هذا هو الحال, عاكس سوف تكون قادرا على قراءة IL على ما يرام ولكن CAS نظام ركلة بها لأسباب غير معروفة.

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

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