Dot-Net

MethodImplOptions.InternalCall 的意義何在?

  • June 22, 2012

BCL 中的許多方法都標有該 [MethodImpl(MethodImplOptions.InternalCall)]屬性。這表明“方法是在公共語言執行時本身內實現的”。

以這種方式設計框架而不是指定執行時將被迫實現的顯式 CIL 指令有什麼意義?最終,該屬性為執行時創建了合同義務,但在我看來,這種方式令人困惑,而且不是立即顯而易見的。

例如,Math.Pow可以這樣寫(如果我的 C# + IL 和 IL 本身不好,請原諒我的非正式混合;這只是解釋我的觀點的一個範例):

public static double Pow(double x, double y)
{
   ldarg.0
   ldarg.1
   pow // Dedicated CIL instruction
   ret
}

而不是目前的方式:

[MethodImpl(MethodImplOptions.InternalCall)]
public static double Pow(double x, double y);

為什麼MethodImplOptions.InternalCall存在?

我認為一個重要的原因是創建一個新的 IL 指令非常困難,它可能會影響很多工具,包括外部工具(ILGenerator、ilasm、ildasm、PEVerify、Reflector、PostSharp,…)。

但是創建一個新InternalCall方法?這幾乎就像在 C# 中編寫方法一樣簡單(我假設,我沒有查看 Rotor 來驗證)並且它不會影響任何東西。

這不僅僅是關於創建它,我認為這同樣適用於維護。

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