3

While reading Troelsen's book "Pro C# 5.0 and the .NET 4.5 Framework", I came across those 2 terms. I understand more or less what a Common Language Runtime(CLR) is, but is ".NET runtime" the same thing as CLR ?

I suppose it is.

4

3 回答 3

7

公共语言运行时是 .NET 运行时的特定实现,但也有其他的——即Mono 运行时

于 2013-05-05T14:08:40.297 回答
7

标准 ECMA-335中定义的通用语言基础设施(CLI)描述了以下内容:

  • 通用类型系统(CTS);
  • 公共语言规范(CLS);
  • 虚拟执行系统(VES);
  • 通用中间语言( CIL)。

VES 在此列表中脱颖而出(它不是Common),并且是对假设运行时系统的描述。实际的运行时实现通常称为公共语言运行时(CLR),但该术语并未出现在 ECMA-335 中。

CLI 有多种实现:.NET Framework、.NET Micro Framework、XNA Framework、Silverlight、Mono 平台等……每个平台或框架都实现了一个或多个版本的 CLR。

有 Microsoft CLR(又名 .NET CLR),通常称为 .NET 运行时。还有一个 Mono CLR,通常称为 Mono 运行时。还有 Silverlight CLR 和 .NET Compact CLR。

由于 Microsoft CLR 是第一个也是最著名的 CLR,因此对 CLR 一词的不合格使用通常指的是没有特定版本的 .NET 运行时。但是 CLR不是.NET 运行时的特定实现......它是相反的。

于 2013-05-06T01:59:41.330 回答
6

CLR 是.NET 程序所需的运行时支持的一部分。相当重要的一部分,但它不是唯一的。您总是会在 .NET 进程中加载​​一组本机 DLL。您可以通过打开非托管调试,项目+属性,调试选项卡,勾选“启用非托管代码调试”来查看它们。启动后,您可以在 Debug + Windows + Modules 窗口中看到这些 DLL。

我将记录 .NET 4.5 版的名称:

  • mscoree.dll,“加载程序存根”。这是加载您的 .NET 程序的程序。Windows 对这个 DLL 有特殊的了解,加载程序在检测到 .NET 可执行文件时会自动将控制权转移给它。它所做的一件非常重要的事情是将 .NET 进程转换为 64 位进程,即使 EXE 标头本身表示 32 位进程。
  • mscoreei.dll,默认的 CLR 主机。CLR 需要一个宿主代码,它可以使 CLR 适应所需的运行时特性。自定义 CLR 主机的示例是 SQL Server 和 ASP.NET。调试 .NET 程序时,Visual Studio 托管进程 vshost.exe 处于活动状态。此 DLL 还负责内置于 .NET 4+ 中的并行版本控制支持,允许进程拥有多个 CLR 版本。
  • clr.dll,就是CLR
  • clrjit.dll,即即时编译器
  • msvcr110_clr0400.dll,C 运行时库。其他 DLL 是用 C++ 编写的,该 DLL 包含基本的运行时支持代码。您也可以自己使用一些,例如 Math.Pow() 最终会调用此 DLL 中的 pow() 函数。

您还会看到从 c:\windows\system32(Windows 操作系统 DLL)加载的一堆 DLL。重要的是 ntdll.dll、kernel32.dll 和 user32.dll。在典型的 .NET 进程中还有更多。您不能真正将它们算作 .NET 运行时组件,因为 Windows 中的每个进程都会使用它们。

于 2013-05-05T22:41:04.857 回答