我一直在玩PostSharp,我遇到了一个讨厌的问题。

在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
public void set_AccountProfileModifiedAt(DateTime value)
{
    bool propertyHasChanged = this.AccountProfileModifiedAt != value;
    this.accountProfileModifiedAt = value;
    if (propertyHasChanged)
    {
        this.NotifyPropertyChanged("AccountProfileModifiedAt");
    }
}
) 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:操作可能会破坏运行时的稳定性。例外。 Reflector解析它没关系。它可能有什么问题?

更新1 代码旨在如下工作:

L_0018: ldloc.0 
L_0019: ldc.i4.0 
L_001a: ceq 
L_001c: stloc.1 
L_001d: ldloc.1 

更新2 我在setter本身内得到了指定的异常

更新3 将非静态调用作为callvirt(NotifyPropertyChanged)进行无效

更新4 注释掉(用于测试目的)代码:

.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<*>)
    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 
}

并用L_001e替换L_001e:brtrue.s L_002b:br.s L_002b可以做到这一点,但这是无条件的回报 - 不是我想要的。

更新5 如果我使用C#编译器模仿所需的行为(我仍然需要使用Postsharp) 我得到了IL:

<*>

注意有一些细微差别 - 在L_0016处额外的br.s跳跃和一些奇怪的跳跃L_001e:brtrue.s L_002b。在编译器版本中,我直接跳转到ret。

有帮助吗?

解决方案

你使用peverify吗?您应该在直接使用MSIL时运行此实用程序(您可以使用msbuild标志/ p:PostSharpVerify = true)。

查看您的代码:

  1. 您的本地变量未初始化(缺少“init”关键字)。这是MethodBodyDeclaration的属性。

  2. 您正在使用'leave'而不是'jmp'来保护块;这没用,但无所谓。

  3. 祝你好运,

    -gael

其他提示

很难说 - 你有堆栈跟踪吗?当CLR无法验证代码的类型安全性时,通常会抛出此异常。由于这可能来自此代码或您正在使用的任何方法或类型,因此如果没有堆栈跟踪,很难说明问题是什么。

这是一个处理该错误的帖子。我不知道你的具体案例是否是由同一个问题引起的,但总的来说,这看起来与代码访问安全性和验证有关。如果是这种情况,Reflector将能够正确读取IL,但CAS系统会因为未知原因而将其踢出。

看起来你有一个属性设置器调用一堆其他对象。如果是帖子中提到的具体问题,你应该通过那些寻找大转换语句的其他方法调用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top