アプリケーションで多くの「スタック内省的」コードを観察してきました。これらのコードは、多くの場合、含まれているメソッドがインライン化されていないことに暗黙的に依存しています。このようなメソッドには、通常、次の呼び出しが含まれます。
MethodBase.GetCurrentMethod
Assembly.GetCallingAssembly
Assembly.GetExecutingAssembly
現在、これらの方法に関する情報は非常に紛らわしいと思います。ランタイムは GetCurrentMethod を呼び出すメソッドをインライン化しないと聞いたことがありますが、その効果に関するドキュメントは見つかりません。CLR がクロスアセンブリ呼び出しをインライン化しないことを示す、このような StackOverflow に関する投稿をいくつか見てきましたが、GetCallingAssembly
ドキュメントはそれ以外のことを強く示しています。
非常に悪名高い もありますが[MethodImpl(MethodImplOptions.NoInlining)]
、CLR がこれを「要求」または「コマンド」と見なすかどうかはわかりません。
契約の観点からのインライン化の適格性について質問していることに注意してください。JITter の現在の実装が実装の問題のためにメソッドを検討することを拒否する時期や、JITter が取引を評価した後に最終的に適格なメソッドをインライン化することを最終的に選択する時期についてではありません。オフ。私はthisとthisを読みましたが、最後の 2 つの点により焦点を当てているようです (MethodImpOptions.NoInlining と「エキゾチックな IL 命令」についての言及がありますが、これらは義務としてではなくヒューリスティックとして提示されているようです)。
CLRをインライン化できるのはいつですか?