CLR与Core CLR比较

24

我了解当前的CLR绑定在Windows操作系统上,并通过内部使用Win32 API提供各种服务。

.NET Core是平台无关的,这意味着相同的IL代码可以在不同的操作系统上运行。CoreCLR是特定于操作系统的吗?还是CoreCLR的代码根据当前执行环境/操作系统采用不同的执行路径?


5
“不同的路径”是错误的心理模型。它始于Unix对可执行文件完全不同的格式。因此,您需要一个能够正确处理这一点的C++编译器和链接器,目前似乎是GCC工具链。并且要#define一堆匹配所需目标操作系统和处理器的宏。源代码中到处都是一大堆#if,这是C ++代码制作跨平台的必备方式。他们目前有10个构建服务器在辛勤工作,不断寻找错误。 - Hans Passant
@HansPassant 谢谢!_“源代码中充斥着大量的#if_”,你是指CoreCLR的同一副本适用于所有操作系统吗? - rahulaga-msft
1
大致上,有一个代码库,但是一些文件在特定的构建中永远不会被使用,因为它们过于依赖操作系统。但是这些文件会在另一个构建中被使用。 - Hans Passant
@HansPassant,我必须对你的整个回答持怀疑态度,因为CoreCLR源代码表明它需要clang而不是gcc。https://github.com/dotnet/coreclr/blob/master/Documentation/building/linux-instructions.md。 - omajid
1
这就是我说“afaik”的原因,我在CMake文件中看到了很多“gcc”。但当然,你可以忽略它们全部。 - Hans Passant
2个回答

21

来自coreclr存储库中的讨论

据我所知,此存储库[coreclr]中的CLR与完整的.NET中的CLR相同,唯一的区别在于corefx中可用的API集。

……但好像至少缺少了C++/CLI……

回答其他一些问题:

由于.NET Core是跨平台的,这基本上意味着相同的IL代码可以在不同的操作系统上运行

是的。IL是一种自定义“语言”。您可以编写一个解释器/运行时,该解释器/运行时可以在任何平台上运行。这对于其他语言中的其他中间表示(包括java bytecode、llvm ir、python bytecode等)也是如此。

CoreCLR是否特定于操作系统?还是CoreCLR代码编写为根据当前执行环境/操作系统采取不同的执行路径?

两者都有。特定版本的coreclr仅适用于一个操作系统,因为它已被编译以使用该操作系统的功能(包括特定于操作系统的编译器,链接到正确的特定于操作系统的库,并运行特定于该操作系统的代码)。CoreCLR中还有一个平台抽象层,这样开发人员可以根据Win32 API编写代码,并且PAL层会将其转换为Linux和Mac上的正确syscall。正如@HansPassant在评论中指出的那样,有大量的#ifdefs——在CoreCLR的本机和托管两侧都有。


-2

CoreCLR 是 .NET Core 中的 .NET 执行引擎,执行垃圾收集和编译为机器代码等功能。

CoreFX 是跨所有平台共享的平台中立代码。平台中立代码可以实现为单个可在所有平台上使用的便携式程序集。

CoreFX 是 .NET Core 的基础类库。它包括用于集合、文件系统、控制台、JSON、XML、异步和许多其他类型的类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接