正如解释的另一个问题 ,NGEN通常只允许内联跨过组件的方法,如果该方法具有TargetedPatchingOptOutAttribute集。
但是,这是对也是如此硬缠使用组件DependencyAttribute与LoadHint.Always
?
编辑:也许回答我最初的问题是没有,否则就没有任何意义了TargetedPatchingOptOutAttribute
在mscorlib中使用,因为该组件总是硬缠(它有DefaultDependencyAttribute集)。 所以我想重组我的问题:是对TargetedPatchingOptOutAttribute
获得跨越组件的原始图像内联的方法的唯一途径?
好像是其他问题导致我完全错误的假设。 在我们自己的组件的方法跨本地图像boundries内联,即使它们既不硬缠,也有TargetedPatchingOptOutAttribute
集。 此属性仅影响.NET Framework程序集。
微软的博客文章有大约一个相当不错部分TargetedPatchingOptOutAttribute
:
“靶向修补 - 方法缺乏TargetedPatchingOptOutAttribute” - 这涉及到一个新的特征在CLR 4,其中NGEN图像更版本弹性。 总而言之,我们希望能够应用修补程序或补丁,以mscorlib.dll中,而不必重新编译依赖于它的机器上的所有其他本地图像。 因为他们是可以启用这个功能的唯一组件这应该只适用于在.NET框架类库的方法。
这意味着:由于.NET Framework程序集现在支持有针对性的修补在.NET 4.0中,从这些组件的方法通常不能被内联。 但标有方法TargetedPatchingOptOutAttribute
是性能的关键,因此选择退出针对性的修补(这意味着如果他们是不断改变,使用该方法的所有本机映像需要重新编译)的。 因为我们自己的assemblis不要使用有针对性的修补,没有理由以防止在本地图像的方法内联。
为了测试这一点,我创建一个小的样品,显示在不同的组件抛出的异常的调用堆栈。 只有我的主要方法和扔异常的方法是调用堆栈。 放置在主叫和被叫组件(即基本上做无非调用next方法更多)两其他一些小方法不能调用堆栈。 这种行为的组件(是的,我查的是使用原生图像)创建本机映像后并没有改变。
TLDR版本:不要在乎TargetedPatchingOptOutAttribute
,它应该只在.NET框架组件中使用。 自主开发的组件方法内联可与NGEN和JIT相同。