私はポストシャープで少し遊んでいましたが、厄介な問題に遭遇しました。CIL:「オペレーションがランタイムを不安定にする可能性があります」例外
のSilverlightアセンブリに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
}
はSystem.Security.VerificationExceptionをトリガー:操作は、ランタイムを不安定化させることができます。例外。 反射板で解析しても問題ありません。何が間違っているのでしょうか?次のように
アップデート1つの コードが動作するように意図されています。私は非静的を作るセッター自体
アップデート3 内の例外を指定します2
public void set_AccountProfileModifiedAt(DateTime value)
{
bool propertyHasChanged = this.AccountProfileModifiedAt != value;
this.accountProfileModifiedAt = value;
if (propertyHasChanged)
{
this.NotifyPropertyChanged("AccountProfileModifiedAt");
}
}
更新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を交換する:L_001eでL_002bをbrtrue.s:br.s L_002bは、トリックを行いますが、それは無条件の復帰だ - ではないものをI欲しいです。私は、必要な動作を模倣するためにC#コンパイラを使用している場合
更新5 私はIL次取得(私はまだPostsharpとすることを行う必要があります):
.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。 L_0016でジャンプし、いくつかの奇妙なジャンプL_001e:brtrue.s L_002b。コンパイラのバージョンでは、私はすぐにretにジャンプします。
トップは単なるプロパティのセッター:(ある。操作はDomain.Accounts.AccountOwnerでランタイム を不安定化させることができます。 set_AccountProfileModifiedAt(DateTime値) –