В чем смысл MethodImplOptions.InternalCall?

многие методы в BCL отмечены . Это указано что "метод реализован в самой среде выполнения общего языка".

в чем был смысл разработки фреймворка таким образом, указав явные инструкции 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);

почему ?

3 ответов


Я думаю, что большая причина в том, что довольно сложно создать новую инструкцию IL, и это может повлиять на множество инструментов, включая внешние (ILGenerator, ilasm, ildasm, PEVerify, Reflector, PostSharp,...).

но создание нового InternalCall способ? Это почти так же просто, как написать метод на C# (я предполагаю, что я не смотрел на Ротор, чтобы проверить), и это ни на что не влияет.

и речь идет не только о его создании, я думаю, то же самое относится к обслуживанию.


Я думаю, что это было не слишком усложнять CLR. Когда я впервые заглянул в CIL, я не мог не заметить сходства с языком ассемблера, и более того, ограниченный набор инструкций, как будто они заставили его работать непосредственно на процессоре.

теоретически, когда CLR JIT - это пример кода для Pow вы включили в свой пост, он должен был бы выдать себе собственный код для pow обучение, так как нет родной инструкции (или это? не были в курсе новых наборов инструкций x86 с нескольких лет назад). Глядя с точки зрения производительности, но и с точки зрения реализации, гораздо проще просто вызвать mscorlib для pow код, чем просто "вставить" его в линию.

или у них могла быть таблица поиска для общих функций mscorlib, которые являются InternalCall и замените инструкцию вызовом самой функции. Но опять же, не все!--3--> так просто.

Я думаю, что это был компромисс для удобства; оба с их стороны, для ремонтопригодности CLR, более единообразного стандарта CLI и обеспечения некоторой гибкости для абонентов.

суть в том, что я не разработал CLR, и это просто с верхней части моей головы. Что-то, что я бы сделал, наверное.


метод является родным, по-настоящему родным, реализованным в самой среде выполнения. Не забывайте, что CLR происходит от C++ в конце концов. Это как в компиляторе. В реальном мире, сил не выполнен. Это JIT-ted, а затем выполняется, как компилятор, средой выполнения C/C++. Математика.Pow, скорее всего, [спекуляция] вызов в родную математику C/C++.метод H pow, и он определен реализацией-теперь NET и Mono реализуют CLR.

В UnityEngine.библиотеки DLL, [MethodImpl(MethodImplOptions.InternalCall)] используется на большинстве родных внешний метод. Эти методы C++, однако, используют библиотеку CLR Mono C++ напрямую, и они могут сотрудничать с C# более интимным способом, чем P/INVOKE. И путь более performant (PInvoke скрывает некоторые детали реализации и делает некоторые трудно понять)

однако, единственный способ использовать [MethodImpl(MethodImplOptions.InternalCall)] Если вы сами среда CLR-я только тестировал моно, как это, однако. Я не знаю, возможно ли даже изменить реализацию CLR Microsoft, но с Mono вы бесплатно злоупотреблять этой функцией.

кроме того, не связывайся с