19

別の質問で説明されているように、メソッドにTargetedPatchingOptOutAttributeが設定されている場合、Ngen は通常、アセンブリ間でメソッドをインライン化することのみが許可されます。

しかし、これはDependencyAttributeを使用してハード バインドされたアセンブリにも当てはまりますか?LoadHint.Always

編集:おそらく私の最初の質問に対する答えはノーです。それ以外の場合TargetedPatchingOptOutAttribute、このアセンブリは常にハード バインドされているため ( DefaultDependencyAttributeが設定されているため)、mscorlib で が使用されても意味がありません。だから私は私の質問を言い換えたいと思います:TargetedPatchingOptOutAttributeアセンブリのネイティブ イメージ全体でメソッドをインライン化する唯一の方法はありますか?

4

1 に答える 1

29

TLDRバージョン:は気にしないでください。.NETFrameworkTargetedPatchingOptOutAttributeアセンブリでのみ使用する必要があります。自己開発されたアセンブリのメソッドインライン化は、NgenおよびJITでも同じように機能します。


他の質問が私を完全に間違った仮定に導いたようです。独自のアセンブリのメソッドは、ハードバインドされておらず、セットがない場合でも、ネイティブのイメージ境界全体にインライン化されます。TargetedPatchingOptOutAttributeこの属性は、.NETFrameworkアセンブリにのみ影響します。

Microsoftのブログ投稿TargetedPatchingOptOutAttributeには、 :に関する非常に優れたセクションがあります。

「ターゲットパッチ-メソッドにTargetedPatchingOptOutAttributeがありません」-これは、NGENイメージのバージョンの復元力が高いCLR4の新機能に関連しています。一言で言えば、mscorlib.dllにパッチまたは修正を適用できることを望んでおり、それに依存するマシン上の他のすべてのネイティブイメージを再コンパイルする必要はありません。これは、.NET Frameworkクラスライブラリのメソッドにのみ適用されます。これは、この機能をオプトインできる唯一のアセンブリであるためです。

つまり、.NETFrameworkアセンブリは.NET4.0でターゲットパッチをサポートするようになったため、通常、これらのアセンブリのメソッドをインライン化することはできません。ただし、でマークされたメソッドTargetedPatchingOptOutAttributeはパフォーマンスが重要であるため、対象のパッチをオプトアウトします(つまり、変更された場合は、そのメソッドを使用するすべてのネイティブイメージを再コンパイルする必要があります)。私たち自身のアセンブリはターゲットを絞ったパッチを使用していないため、ネイティブ画像間でメソッドがインライン化されるのを防ぐ理由はありません。

これをテストするために、別のアセンブリでスローされた例外の呼び出しスタックを示す小さなサンプルを作成しました。私のメインメソッドと例外をスローしたメソッドだけが呼び出しスタックにありました。呼び出し元のアセンブリと呼び出されたアセンブリの両方に配置された他のいくつかの小さなメソッド(基本的には次のメソッドを呼び出すだけです)は、呼び出しスタックにありませんでした。この動作は、アセンブリのネイティブイメージを作成した後も変わりませんでした(はい、ネイティブイメージが使用されていることを確認しました)。

于 2013-02-20T14:31:14.827 に答える