19

正如另一个问题中所解释的,如果方法具有TargetedPachingOptOutAttribute集,则通常只允许 Ngen 跨程序集内联方法。

但是,通过使用DependencyAttribute硬绑定程序集也是如此吗?LoadHint.Always

编辑:也许我最初的问题的答案是否定的,否则TargetedPatchingOptOutAttribute在 mscorlib 中使用它是没有意义的,因为这个程序集总是硬绑定的(它具有DefaultDependencyAttribute集)。所以我想重新提出我的问题:在TargetedPatchingOptOutAttribute程序集的本机图像中内联方法是唯一的方法吗?

4

1 回答 1

29

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 方法和引发异常的方法在调用堆栈中。在调用和被调用程序集中放置的其他一些小方法(基本上只是调用下一个方法)不在调用堆栈中。在为程序集创建本机映像后,此行为没有改变(是的,我检查了是否使用了本机映像)。

于 2013-02-20T14:31:14.827 回答