跨组件的本机映像的内联方法

时间:2013-02-18 13:37:55

标签: .net .net-assembly ngen

another question中所述,如果方法设置了TargetedPatchingOptOutAttribute,则通常只允许Ngen跨程序​​集内联方法。

但是hard bound使用LoadHint.Always时,DependencyAttribute程序集也是如此吗?

编辑:也许我最初的问题的答案是否定的,否则在mscorlib中使用TargetedPatchingOptOutAttribute是没有意义的,因为这个程序集总是很难绑定(它有DefaultDependencyAttribute设置)。所以我想重新解释一下我的问题:TargetedPatchingOptOutAttribute是唯一一种在组件的原生图像中内联方法的方法吗?

1 个答案:

答案 0 :(得分:28)

似乎other question导致我完全错误的假设。我们的自己的程序集中的方法跨本机图像边界内联,即使它们既不是硬约束也不是TargetedPatchingOptOutAttribute设置。此属性仅影响.NET Framework程序集。

A Microsoft blog post有一个关于TargetedPatchingOptOutAttribute的非常好的部分:

  

“有针对性的补丁 - 方法缺少TargetedPatchingOptOutAttribute” -   这与CLR 4中的新功能有关,其中NGEN图像更多   版本有弹性。简而言之,我们希望能够应用补丁   或修复mscorlib.dll而不必重新编译所有其他本机   机器上依赖它的图像。这应该只适用于   .NET框架类库中的方法,因为它们是   只有可以选择加入此功能的程序集。

这意味着:由于.NET Framework程序集现在支持.NET 4.0中的targeted patching,因此通常无法内联这些程序集中的方法。但是标有TargetedPatchingOptOutAttribute的方法对性能至关重要,因此选择退出目标修补(这意味着如果它们被更改,则需要重新编译使用该方法的所有本机映像)。由于我们自己的assemblis不使用有针对性的修补,因此没有理由阻止本地图像中的方法内联。

为了测试这个,我创建了一个小样本,显示了在不同程序集中抛出的异常的调用堆栈。只有我的main方法和抛出异常的方法才在调用堆栈中。调用和调用程序集中放置的其他一些小方法(基本上只是调用下一个方法)不在调用堆栈中。在为程序集创建本机映像后,此行为未发生更改(是的,我检查过使用了本机映像)。

TLDR版本:不关心TargetedPatchingOptOutAttribute,它只应在.NET Framework程序集中使用。自行开发组件的内联方法与Ngen和JIT的工作原理相同。