CLR 内部调用是用什么语言编写的?

What language are CLR internal calls written in?

Pro .NET Performance - Optimize Your C# Applications 中第 86 页的底部,它谈到了 ValueType.Equals() 的实现并这样说:

The definition of CanCompareBits and FastEqualsCheck is deferred to the CLR, they are "internal calls", not implemented in IL

"internal calls" 到底是什么?如果不是 IL,它们是用什么语言实现的?

编写或编译公共语言运行时的语言。不幸的是,由于 IL 代码有许多不同的 Runtimes/Interpreters,如果您不告诉我我们正在谈论的具体,我无法告诉您更准确的信息。

.NET 程序被编译成中间语言。 IL 然后由 CLR 运行。如果您认为这听起来像是 Java 字节码被 Java 应用程序执行 - 你是对的!这绝对是一种灵感。然而,这也是一个进步。

从几个角度来看,.NET 程序被解释为批处理文件、Java 字节码、Java 脚本或 PHP/Python 脚本。所有这些都可以做一些事情,但它们不会为其中的程序 运行ning 提供。

方法,如提到的 CanCompareBitsFastEqualsCheck 标记有 [MethodImpl(MethodImplOptions.InternalCall)],它通知 clr 它需要在其内部找到实现。就 CLR 而言,它称为 FCall,请参阅 Calling from managed to native code

由于 coreclr 是开源的,因此很容易在 github 上找到实际实现。 FastEqualsCheck 参见 comutilnative.cpp。 CoreCLR 是用 C++ 和 Mono 编写的,因此所有此类内部调用的所有代码都是 C/C++。

在运行时,与将生成 IL(中间语言)的常规 .net 代码相反,此类内部调用是依赖于平台的汇编指令