TLDR 版本:不要关心TargetedPatchingOptOutAttribute
,它应该只在 .NET Framework 程序集中使用。自开发程序集的方法内联与 Ngen 和 JIT 相同。
似乎另一个问题让我做出了一个完全错误的假设。我们自己的程序集中的方法是跨原生图像边界内联的,即使它们既没有硬绑定也没有TargetedPatchingOptOutAttribute
集合。此属性仅影响 .NET Framework 程序集。
Microsoft 博客文章有一个关于以下内容的非常好的部分TargetedPatchingOptOutAttribute
:
“有针对性的修补 - 方法缺少 TargetedPatchingOptOutAttribute” - 这与 CLR 4 中的一个新功能有关,其中 NGEN 图像更具版本弹性。简而言之,我们希望能够对 mscorlib.dll 应用补丁或修复,而不必重新编译机器上依赖它的所有其他本机映像。这应该只适用于 .NET 框架类库中的方法,因为它们是唯一可以选择使用此功能的程序集。
这意味着:由于 .NET Framework 程序集现在支持.NET 4.0 中的目标修补,因此这些程序集的方法通常无法内联。但是标有 的方法对TargetedPatchingOptOutAttribute
性能至关重要,因此选择退出目标修补(这意味着如果它们被更改,所有使用该方法的本机映像都需要重新编译)。由于我们自己的程序集不使用有针对性的修补,因此没有理由阻止跨原生图像的方法内联。
为了测试这一点,我创建了一个小示例,该示例显示了在不同程序集中引发的异常的调用堆栈。只有我的 main 方法和引发异常的方法在调用堆栈中。在调用和被调用程序集中放置的其他一些小方法(基本上只是调用下一个方法)不在调用堆栈中。在为程序集创建本机映像后,此行为没有改变(是的,我检查了是否使用了本机映像)。