Wiele metod w BCL jest oznaczonych atrybutem [MethodImpl(MethodImplOptions.InternalCall)]
. Ten indicates, że "metoda jest zaimplementowana w samym środowisku wykonawczym języka wspólnego".Jaki jest sens MethodImplOptions.InternalCall?
Po co projektować tę platformę, mając określone instrukcje CIL, które będą musiały zostać uruchomione w środowisku wykonawczym? Ostatecznie atrybutem jest tworzenie zobowiązań umownych dla środowiska wykonawczego, ale w sposób, który wydaje mi się mylący i nie od razu oczywisty.
Na przykład Math.Pow
mógł zostać napisany w ten sposób (usprawiedliwienia mój nieformalny mieszankę C# + IL, a sam, jeśli jest zły IL; to tylko próby, aby wyjaśnić mój punkt):
public static double Pow(double x, double y)
{
ldarg.0
ldarg.1
pow // Dedicated CIL instruction
ret
}
zamiast aktualnej:
[MethodImpl(MethodImplOptions.InternalCall)]
public static double Pow(double x, double y);
Dlaczego istnieje MethodImplOptions.InternalCall
?
To nie tak, że nie może działać, to po prostu strasznie się skaluje. Transakcje na stosach są niejawne dla opkodów IL, wiele narzędzi musiałoby zostać zaktualizowanych, aby radzić sobie z sygnaturami funkcji. Jest za darmo, gdy deklaracja znajduje się w metadanych. Łatwo rozszerzalny poza standard Ecma-335. –
@Hans: było pytanie o dodanie teraz obsługi nowych instrukcji IL? Zrozumiałem, że Ani chciała wiedzieć, dlaczego metody "InternalCall" były na pierwszym miejscu. Po prostu prosząc ... –
@teoon - '// Dedykowane instrukcje CIL' to dobra wskazówka. –