2009-03-05 2 views
1

나는 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로 직접 점프합니다.

답변

2

peverify를 사용하셨습니까? MSIL로 직접 재생할 때 항상이 유틸리티를 실행해야합니다 (msbuild 플래그/p : PostSharpVerify = true를 사용할 수 있음).

코드를 보면 :

지역 변수가 초기화되지 않습니다
  1. (실종 "초기화"키워드). MethodBodyDeclaration의 프로퍼티입니다.

  2. 보호 된 블록에서 'jmp'대신 'leave'를 사용하고 있습니다. 이것은 쓸모 없지만 중요하지 않아야합니다. System.Security.VerificationException :

행운을 빌어 요, 스택의

-gael

0

말하기 어렵습니다 - 스택 추적이 있습니까? 이 예외는 일반적으로 CLR이 코드의 유형 안전성을 확인할 수없는 경우 발생합니다. 이 코드 또는 사용중인 메서드 또는 유형에서 스택 추적없이 문제가 무엇인지 말할 수 없으므로 이러한 오류가 발생할 수 있습니다.

+0

최고 그냥 속성 setter :(이다. 운전 Domain.Accounts.AccountOwner에서 런타임 을 불안정하게 할 수있다. !이처럼 보이는 방법 set_AccountProfileModifiedAt (날짜 시간 값) –

0

Here's 해당 오류를 다루는 게시물. 귀하의 특정 사건이 동일한 문제로 인해 발생했는지는 모르지만 일반적으로 코드 액세스 보안 및 검증과 관련이있는 것 같습니다. 그렇다면 리플렉터는 일리노이를 잘 읽을 수 있지만 CAS 시스템은 알 수없는 이유로 쫓아 낼 것입니다.

속성 설정자가 다른 개체를 호출하는 것처럼 보입니다. 게시물에서 언급 된 특정 문제 일 경우 큰 스위치 문을 찾는 다른 메서드 호출을 수행해야합니다.

+0

이입니다 부울 propertyHasChanged = this.AccountProfileModifiedAt = 값; this.accountProfileModifiedAt = 값; (propertyHasChanged) {을 경우this.NotifyPropertyChanged ("AccountProfileModifiedAt"); } IMO 일부 다른 메서드가 실패하면 setter에서 오류가 발생하지 않아야합니다. –

+0

액세스하는 다른 메서드/속성 중 하나가 예외 일 수 있습니다. 테스트로서 setter에서 모든 코드를 꺼내서 수정하는지 확인하십시오. 그런 다음 코드를 비트 단위로 추가하여 실패한 부분을 정확하게 파악하십시오. –

관련 문제