C# TargetedPatchingOptOut:“;性能对跨NGen映像边界内联至关重要“是什么;?

C# TargetedPatchingOptOut:“;性能对跨NGen映像边界内联至关重要“是什么;?,c#,.net,compiler-construction,ngen,C#,.net,Compiler Construction,Ngen,我们已经使用reflector查看了一些框架类,并注意到一些方法和属性具有以下属性 [TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")] 我敢肯定,我在其他地方也看到过上述评论,从未跟进过 有人能告诉我这在C#和任何其他上下文中意味着什么吗?它告诉NGen,即使在不同的程序集中,也可以内联应用它的方法 例如: String.Equals具有[TargetedPatchin

我们已经使用reflector查看了一些框架类,并注意到一些方法和属性具有以下属性

[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
我敢肯定,我在其他地方也看到过上述评论,从未跟进过


有人能告诉我这在C#和任何其他上下文中意味着什么吗?

它告诉NGen,即使在不同的程序集中,也可以内联应用它的方法

例如:

  • String.Equals
    具有
    [TargetedPatchingOptOut]
  • 您编写的程序调用
    String.Equals
  • 您可以运行此程序以获得最佳性能
  • NGen将内联
    字符串.Equals
    调用,用方法中的实际代码替换方法调用指令。
    方法调用(稍微)昂贵,因此这对频繁调用的方法来说是一个性能提升
但是,如果Microsoft在
String.Equals
中发现安全漏洞,则他们不能只更新
mscorlib.dll
,因为这不会影响您刚刚创建的程序集。(因为它的原始机器代码没有引用
String.Equals
)。
我假设如果真的发生这种情况,安全更新将清除NGen存储


请注意,此属性仅在.NET Framework程序集中有用。你自己不需要它。您可以在这里找到更多信息:

我们可以在自己的框架中使用此属性吗?我的开源库中有很多数学函数,这些函数将从中受益……如果.NET framework被修补,现有的本机映像文件将失效并重新创建(至少我是这么理解的)@MattDavey不,你不应该在自己的代码中使用此属性。如中所述:“此API支持.NET Framework基础结构,不打算直接从代码中使用。”。此属性仅影响使用目标修补的程序集。这里可以找到一些源代码链接的更详细的解释:我们所有的代码都可以自动跨程序集边界内联,这意味着这个属性对我们来说完全没有用处,这一事实确实需要在答案中提及…@MattDavey如果你想给编译器一个提示,让你的方法尽可能内联,使用
[MethodImpl(methodimpoptions.aggressiveinline)]