这是DNX的描述:
.NET 执行环境 (DNX) 是一个软件开发工具包 (SDK) 和运行时环境,拥有构建和运行适用于 Windows、Mac 和 Linux 的 .NET 应用程序所需的一切。它提供宿主进程、CLR 宿主逻辑和托管入口点发现。DNX 是为运行跨平台 ASP.NET Web 应用程序而构建的,但它也可以运行其他类型的 .NET 应用程序,例如跨平台控制台应用程序。
DNX 是 Mono 的替代品吗?如果不是,那会有什么区别?
是的,DNX 与 Mono 的 mono.exe 相当。或者就此而言,其他 VM 语言的运行时,如 Java (java.exe) 或 Python (python.exe)。它们都解决了相同的先有鸡还是先有蛋的问题,它们运行在不知道有关 VM 的 bean 的操作系统上。它必须首先初始化,需要定位程序的入口点,并且需要在程序开始运行之前运行 Main() 方法。
DNX 与这些其他 VM 的一个小区别是它将 CLR 和抖动仍然保留在单独的库 coreclr.dll 中。其他的都是单体的,所有运行时支持代码都编译成一个 exe。保持整体性可以提高冷启动性能。一旦CoreCLR稳定并且没有无数不同的beta版本,dnx也可能会发生一些事情。
否则,这遵循 Windows 上的 .NET 体系结构,它是 c:\windows\system32\mscoree.dll 引导 CLR。CLR 和 jitter 是单独的 DLL,用于 .NET 4.x 的 clr.dll 和 clrjit.dll。Mscoree 使用了大量的诡计和欺骗手段,使您看起来可以从单个 EXE 文件启动托管程序。特别是从 32 位 EXE 文件创建 64 位进程的技巧是英雄,它修补了内部操作系统加载程序结构来完成这一壮举。这要求 Windows 本身知道 EXE 包含托管代码。不能很好地转化为其他操作系统(如 Linux 和 OSX)的技巧,因此他们决定为 CoreCLR 采用更传统的方式。
更新: DNX 现在已弃用并由 DOTNET 取代。否则不会使此帖子内容无效,只是更易于使用。
DNX 是 Mono 的替代品吗?如果不是,那会有什么区别?
Mono 是一个开源开发平台。它的实现基于 CLI 规范,例如 Microsoft 提供的平台。它包括一个 C# 编译器、一个运行时、一个 BCL 和称为 MCL(Mono 类库,它是 BCL 的扩展)的东西。Mono 本身可以在不同架构的 Linux、OS X、BSD 和 Windows 上运行。
DNX 是一个 SDK,包含构建和运行应用程序所需的所有位(包括自定义实用程序,例如dnu
用于构建和打包应用程序的工具),包括 CLR(目前它与CoreCLR一起部署)。这个 CoreCLR 也可以与 Mono 切换,这意味着它将消耗 Mono 运行时、编译器等的所有服务。
与 DNX 相比,Mono 提供了完整的平台(运行时、BCL、JIT 等)。DNX 在最低级别用作调用 CoreCLR 的本机进程。DNX 将用于自托管或从命令行构建和运行等场景。
正如@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 页面解释了 DNX 结构以获取更多信息。@Will 还指出了ASP.NET 文档页面。
DNX 现在已弃用,取而代之的是.NET CLI Tools。
.NET CLI 工具现已停用,取而代之的是dotnet sdk