.NET 执行环境 (DNX) 是否类似于 Mono?

Is .NET Execution Environment (DNX) similar to Mono?

这里是 DNX 的描述:

The .NET Execution Environment (DNX) is a software development kit (SDK) and runtime environment that has everything you need to build and run .NET applications for Windows, Mac and Linux. It provide a host process, CLR hosting logic and managed entry point discovery. DNX was built for running cross-platform ASP.NET Web applications, but it can run other types of .NET applications, too, such as cross-platform console apps.

DNX 是 Mono 的替代品吗?如果不是,那有什么不同?

Is DNX an alternative to Mono? If not, then what will be the difference?

Mono 是一个开源开发平台。它的实现基于CLI规范,例如微软提供的平台。它包括一个 C# 编译器、一个 运行time、一个 BCL 和一个叫做 MCL 的东西(Mono Class 库,它是 BCL 的扩展)。 Mono 本身可以 运行 在 Linux、OS X、BSD 和 Windows 上的不同架构上。

DNX 是一个 SDK,包含构建和 运行 应用程序所需的所有位(包括自定义实用程序,例如用于构建和打包应用程序的 dnu),包括CLR(目前它使用 CoreCLR 部署)。此 CoreCLR 也可以与 Mono 切换,这意味着它将消耗 Mono 运行时间、编译器等的所有服务

与 DNX 相对的 Mono 提供了完整的平台(运行时、BCL、JIT 等)。 DNX 在最低级别用作调用 CoreCLR 的本机进程。 DNX 将用于自托管或构建等场景以及从命令行 运行ning。

正如@xanatos 指出的那样,DNX 渴望能够随应用程序一起发布 运行 时间,其中多个 运行 时间将能够并存而不会相互干扰。

也许这张图片可以说明:

这是 DNX 可以 运行 置顶的列表(x86 显示两次,因为它是默认值):

Active Version           Runtime Architecture Location                           Alias
------ -------           ------- ------------ --------                           -----
  *    1.0.0-beta2-10735 clr     x86          C:\Users\victorhu\.dnx\runtimes default
       1.0.0-dev         clr     x64          C:\Users\victorhu\.dnx\runtimes clr-x64-dev
       1.0.0-dev         clr     x86          C:\Users\victorhu\.dnx\runtimes clr-x86-dev
       1.0.0-dev         coreclr xd64         C:\Users\victorhu\.dnx\runtimes coreclr-x64-dev
       1.0.0-dev         coreclr x86          C:\Users\victorhu\.dnx\runtimes coreclr-x86-dev
       1.0.0-dev         mono                 C:\Users\victorhu\.dnx\runtimes mono-dev

还有一个广泛的wiki page explaning the DNX structure for more. @Will points out the ASP.NET docs page

更新:25/02/2016

DNX 现已停用,取而代之的是 .NET CLI Tools

更新:2020 年 8 月 6 日

.NET CLI 工具 现已停用,取而代之的是 dotnet sdk

是的,DNX 与 Mono 的 mono.exe 相比相当出色。或者就此而言,其他 VM 语言的 运行 时间 Java (java.exe) 或 Python (python.exe)。他们都解决了同样的鸡和蛋的问题,他们 运行 在不了解 VM 的操作系统上。它必须首先初始化,需要找到程序的入口点,并且需要在程序启动之前调整 Main() 方法 运行ning.

DNX 与这些其他 VM 的一个小区别是它将 CLR 和抖动保持在单独的库中,coreclr.dll。其他的是整体的,所有 运行time 支持代码都编译成一个 exe。保持它的整体性可以提高冷启动性能。一旦 CoreCLR 稳定并且没有无数不同的 beta 版本,dnx 可能也会发生一些事情。

这在其他方面遵循 Windows 上的 .NET 体系结构,它是引导 CLR 的 c:\windows\system32\mscoree.dll。 CLR 和抖动是单独的 DLL,clr.dll 和 clrjit.dll for .NET 4.x。 Mscoree 使用重要的诡计和欺骗手段,使您看起来可以从单个 EXE 文件启动托管程序。特别是从 32 位 EXE 文件创建 64 位进程的技巧是英雄,它修补内部操作系统加载器结构来完成这一壮举。这需要 Windows 本身知道 EXE 包含托管代码。无法很好地转化为其他操作系统(如 Linux 和 OSX)的诡计,因此他们决定为 CoreCLR 采用更传统的方式。


更新:DNX 现已弃用并且 replaced by DOTNET。否则不会使这个post内容失效,只是更容易使用。

DNX 已停用,正如它在 repo site. It is better to compare .NET CLI 上所说的那样。 .NET CLI 是新项目,它不支持所有 .NET 库案例。它有自己的核心库,不同于.NET框架。