DNX的全称是.NET Execution Enviroment(.NET执行环境),它是.NET跨平台的一个重要角色。如果你关注.NET的跨平台,一定要关注DNX

由于Mono 4.0的一个bug(现已修复),目前如果要在Mac上编译dnx,需要先签出Mono的源代码进行编译,详见 Bug 29499 - System.IO.EndOfStreamException when running dnx command 。

在Mac OS X编译Mono的方法可以参考 Compiling Mono on Mac OS X 。用到的命令如下:

brew install autoconf automake libtool pkg-config
git clone https://github.com/mono/mono.git
cd mono
./autogen.sh --prefix=/usr/local --disable-nls
make
make install

编译好Mono之后(编译是一个漫长的过程),需要修改dnx中的packages/KoreBuild/build/_kpm-build.shade文件(如果没有这个文件,需要先运行一下./build.sh)

exec program='cmd' commandline='/C kpm pack${pack_options} ${projectFolder} --configuration ${configuration}' if='!IsMono'
exec program='kpm' commandline='pack${pack_options} ${projectFolder} --configuration ${configuration}' if='IsMono'

将其中的kpm改为dnu(不然编译时会报“找不到kpm”的错误,都是改名惹的祸):

exec program='cmd' commandline='/C dnu build${build_options} ${projectFolder} --configuration ${configuration}' if='!IsMono'
exec program='dnu' commandline='build${build_options} ${projectFolder} --configuration ${configuration}' if='IsMono'

然后运行./build.sh命令就可以成功编译dnx。

编译出来的东东都在artifacts/build文件夹中。其中有2个重要的文件夹:dnx-mono与dnx-coreclr-darwin-x64,前者是基于Mono的dnx,后者是基于CoreCLR的dnx,通过dnvm安装的dnx就是这个。它们包含了执行一个.NET程序所需要的一切,它们就是.NET Execution Enviroment(.NET执行环境)。

不信,我们可以用一个非常简单的.NET程序测试一下。

这个.NET测试程序叫HelloDnx,只有2个文件:

1)Program.cs

using System;

public class Program
{
public static void Main()
{
Console.WriteLine("Hello from DNX!");
}
}

2)project.json

{
"dependencies":{
},
"frameworks":{
"dnx451":{},
"dnxcore50":{}
}
}

我们用自己编译的dnx运行这个HelloDnx试试。

首先删除以前通过dnvm安装的dnx。

cd ~/.dnx/runtimes
rm -rf *

然后用我们自己编译出的dnx中的dnu命令恢复nuget包包:

/Git/dotnet/dnx/artifacts/build/dnx-mono/bin/dnu restore
Microsoft .NET Development Utility v1.0.0-t150525235008

Restoring packages for /Git/dotnet/HelloDnx/project.json
Writing lock file /Git/dotnet/HelloDnx/project.lock.json
Restore complete, 159ms elapsed

接着用我们自己编译出来的dnx运行这个HelloDnx程序。

先用基于Mono的dnx:

/Git/dotnet/dnx/artifacts/build/dnx-mono/bin/dnx . run

运行结果:

Hello from DNX!

运行成功!

接着用基于CoreCLR的dnx:

/Git/dotnet/dnx/artifacts/build/dnx-coreclr-darwin-x64/bin/dnx . run

运行结果:

Resource string id=0x17FC System.DllNotFoundException: Resource string id=0x170B
at Interop.mincore.GetStdHandle(Int32 nStdHandle)
at System.Console.<>c__DisplayClass0.<get_Error>b__5()
at System.Console.EnsureInitialized[T](T& field, Func`1 initializer)
at dnx.host.RuntimeBootstrapper.PrintErrors(Exception ex)
at dnx.host.RuntimeBootstrapper.Execute(String[] args)
at DomainManager.Execute(Int32 argc, Char** argv)

运行失败。可能是少了某个程序集或者程序集版本不对,暂不去研究。基于CoreCLR的dnx目前还在开发中,出问题也正常。(这个问题的确是一个bug,详见#issue1955

在Mac上如此折腾一下,一是可以实际体会一下.NET跨平台的进展,二是可以随时折腾dnx,改改dnx的代码,编译出来就可以用它跑.NET程序。

在Mac上用自己编译出的DNX运行.NET程序的更多相关文章

  1. 在Mac OS X上用自己编译出的CoreCLR运行.NET程序

    当昨天被Mac OS X上无法编译CoreCLR的问题困扰时(详见Mac OS X上尝试编译CoreCLR源代码),后来发现这个难题竟然被神人@kangaroo给解决了,连CoreCLR的微软开发人员 ...

  2. 记一次在mac上源码编译curl,使其支持NSS的过程

    一.背景 在一次学习https原理的过程中,希望客户端指定特定的cipher suites来抓包分析SSL/TLS的握手过程,就想到了使用curl工具,而不是使用浏览器. 接下来使用man curl找 ...

  3. mac上Android反编译工具apktool、dex2jar入门

    MAC上Apktool的安装 官网链接   image.png 使用步骤如图1-6 第一:下载一个shell脚本,保存的名字就是”apktool”,不要带.sh后缀.可以复制到sublimetext, ...

  4. Mac上利用Eclipse编译Cocos2d-x

    目前使用较多的Cocos2d-x开发平台是XCode,应该是由于大部分Cocos2d-x开发者都是iOS开发出生.但是当我们将XCode开发的Cocos2d-x工程发布Android版本时,每次都需要 ...

  5. MAC上postman离线安装时提示加载扩展程序出错怎么办?

    目前的postman插件如果想正常使用,必须安装Postman Interceptor插件,这样才能直接使用chrome浏览器的cookie等信息,否则postman是无法完成老版本的功能的.post ...

  6. 剖析并利用Visual Studio Code在Mac上编译、调试c#程序

    0x00 前言 一周多以前的微软的Build大会上,微软发布了一个让很多人眼前一亮的工具,也是本文的主角——Visual Studio Code.很多使用Windows的朋友都很高兴,认为又多了一个很 ...

  7. 剖析并利用Visual Studio Code在Mac上编译、调试c#程序【转】

    0x00 前言 一周多以前的微软的Build大会上,微软发布了一个让很多人眼前一亮的工具,也是本文的主角——Visual Studio Code.很多使用Windows的朋友都很高兴,认为又多了一个很 ...

  8. 如何在 Mac 上通过 Boot Camp 安装 Windows?

    如何在 Mac 上通过 Boot Camp 安装 Windows? The following contents are chosen from the apple website, thanks f ...

  9. Delphi for iOS开发指南(1):在Mac上配置你的开发环境

    http://cache.baiducontent.com/c?m=9d78d513d99516f11ab7cf690d678c3b584380122ba7a0020fd18438e4732b4050 ...

随机推荐

  1. XproerIM V1,2,12,65376 发布。

    客户端下载:http://yunpan.cn/QTCxKvcpC4Iet  访问密码 9141 更新说明:1.增加表情功能. 更新代码截图:

  2. 编程范式 epesode2 negative values, float 精度

    episode2 //it is very interesting,an excellect teacher,  I love it 1,why negative is indicated the w ...

  3. jqGrid学习笔记(一)

    3.2.body中的代码 <!-- jqGrid table list4 --> <table id="list4"></table> < ...

  4. 获取 input 单选框和多选框的值

    引用  jQuery的js <script> $(function(){ var arr = new Array(); $('#checkbox').click(function(){ a ...

  5. Spring MVC开发环境的搭建和实例

    一.安装jdk 二.安装tomcat 三.安装maven 新增环境变量MAVEN-HOME,并在path变量中添加bin路径 四.安装IntelliJ IDEA 五.创建maven web项目选择jd ...

  6. ELK日志管理之——elasticsearch部署

    1.配置官方yum源 [root@localhost ~]# rpm --import http://packages.elasticsearch.org/GPG-KEY-elasticsearch ...

  7. 连接Oracle的帮助类

    package util; import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedState ...

  8. Spinal Tap Case

    function spinalCase(str) { // "It's such a fine line between stupid, and clever." // --Dav ...

  9. String与StringBuffer的区别

    首先,String和StringBuffer主要有2个区别: (1)String类对象为不可变对象,一旦你修改了String对象的值,隐性重新创建了一个新的对象,释放原String对象,StringB ...

  10. C#枚举描述获取

    public static class EnumExtension    {        public static string GetDescription(this Enum value)   ...