Dot-Net

跨程序集的本機映像內聯方法

  • February 18, 2013

正如另一個問題中所解釋的,如果方法具有TargetedPachingOptOutAttribute集,則通常只允許 Ngen 跨程序集內聯方法。

但是,通過使用DependencyAttribute硬綁定程序集也是如此嗎?LoadHint.Always

**編輯:**也許我最初的問題的答案是否定的,否則TargetedPatchingOptOutAttribute在 mscorlib 中使用它是沒有意義的,因為這個程序集總是硬綁定的(它具有DefaultDependencyAttribute集)。所以我想重新提出我的問題:在TargetedPatchingOptOutAttribute程序集的本機圖像中內聯方法是唯一的方法嗎?

**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 方法和引發異常的方法在呼叫堆棧中。在呼叫和被呼叫程序集中放置的其他一些小方法(基本上只是呼叫下一個方法)不在呼叫堆棧中。在為程序集創建本機映像後,此行為沒有改變(是的,我檢查了是否使用了本機映像)。

引用自:https://stackoverflow.com/questions/14937647