TargetedPatchingOptOut和抽象方法上的其他属性

时间:2014-05-07 11:10:18

标签: c# .net implementation abstract jit

由于TargetedPatchingOptOut等属性未在框架内处理,因此在优化期间属性是否会传播到继承的类?

例如:

public abstract class TestBase
{
    [TargetedPatchingOptOut("Optimize across boundaries")]
    public abstract void TestFunc();
}

public class Test : TestBase
{
    // Is re-defining attributes like these necessary?
    public override void TestFunc()
    {
        throw new NotImplementedException();
    }
}

此外,JIT编译器(永远/永远)查找继承属性吗?

  

注意:虽然通过检查WinDbg上的JIT指令可以轻松找出上面的特定功能   (繁琐的)奢侈的方法,我很欣赏任何有关它的见解   实现,因为 JIT编译器不是不可能的行为   对于不同的属性,在不知道其确切性的情   实施

更新:

我做了一个错误的假设,即TargetedPatchingOptOut由JIT编译器处理,但它实际上是由NGen处理的。 @Hans Passant清楚地回答了这个具体案例的答案。

我认为可以安全地猜测,每个内部工具都使用与AttributeUsage标志相同的规则来使用属性。

1 个答案:

答案 0 :(得分:3)

默认情况下属性在派生类上是否可见由AttributeUsageAttribute.Inherited属性确定。这个属性的 false

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Constructor, 
     AllowMultiple = false, Inherited = false)]
public sealed class TargetedPatchingOptOutAttribute : Attribute {
    // etc...
}

它不是独占的,像Type.GetCustomAttribute()这样的方法也有一个 inherit 参数,允许覆盖默认值。

小心做出关于什么工具读取属性的假设。 [TargetedPatchingOptOut]几乎肯定是被抖动读取。它用于确定在部署更新时Ngen.exe是否需要运行以重新创建程序集的本机映像。我不知道工具是什么样的,唯一对我有意义的是,这是在Redmond的Microsoft机器上完成的。