나는 PostSharp로 조금 놀았으며 불쾌한 문제에 처했습니다. 실버 조립체에 따라 ILCIL : "작업으로 인해 런타임이 불안정해질 수 있습니다."예외
:
.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)가 도움이되지 않음으로써 전화가 걸림
주석 처리 (10)업데이트 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 : L_002b 트릭을 수행 br.s하지만 무조건 반환의 - 아니 내가 필요. 내가 필요한 동작을 모방하는 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로 직접 점프합니다.
최고 그냥 속성 setter :(이다. 운전 Domain.Accounts.AccountOwner에서 런타임 을 불안정하게 할 수있다. !이처럼 보이는 방법 set_AccountProfileModifiedAt (날짜 시간 값) –