我正在努力让自己了解.NET核心的低端知识,以了解发生了什么事情, 我知道CoreCLR提供了垃圾收集器,JIT编译器,基本.NET类型和其他低级类,这最终暗示它是任何正在运行的应用程序的一部分。 当我在ASP.NET Core项目中寻找它时,我发现它没有安装,而且是available for download作为NuGet软件包。 然后,我在CoreCLR存储库的README文件中找到了这个有趣的部分:
但是您对CoreCLR不能做很多事情的主要原因是,类库LOOK中的所有类型都是由CoreFX框架而不是CoreCLR定义的。此处定义的任何库代码都位于一个名为System.Private.CoreLib.dll的DLL中,顾名思义,它是私有的(隐藏的)。对于CoreCLR中定义的任何特定PUBLIC类型,我们在CoreFX中自然找到了“正确的”包,并将其用作其公共发布点。然后,该“ facade”包会将引用转发到此处定义的System.Private.CoreLib.dll中的(私有)实现。例如,在CoreFX中定义的System.Runtime包为诸如System.Object和System.String之类的类型声明PUBLIC名称。因此,从应用程序的角度来看,这些类型存在于System.Runtime.dll中。但是,System.Runtime.dll(在CoreFX存储库中定义)最终将引用转发到此处定义的System.Private.CoreLib.dll
据我了解(不确定),CoreCLR中的每个类型(如String
)都定义了两次,一个在CoreCLR(实际定义)中定义,另一个在CoreFX中定义,即 facade 定义最终指向打包的CoreCLR(System.Private.CoreLib.dll),并且在NuGet中显示的包装Microsoft.NETCore.Runtime.CoreCLR无效,因为我只能通过CoreFX访问它。
我希望有人确认或纠正我。