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. 关于Function.prototype.bind

    bind()方法会创建一个新函数,称为绑定函数.当调用这个绑定函数时,绑定函数会以创建它时传入bind()方法的第一个参数作为 this,传入 bind() 方法的第二个以及以后的参数加上绑定函数运行 ...

  2. 解决OneNote的无法同步的问题

    微软的OneNote一直是我比较喜欢的笔记软件,一些复杂的笔记用它来存储比Evernote要强大很多,然而这几天发现一直无法同步,登陆https://onedrive.live.com/看了一下,发现 ...

  3. windows下Redis编译安装

    redis是现在比较流行的noSQL,主流大型网站都用的比较多,很多同学不知道怎么安装,这里介绍在windows下面安装以及扩展,提供学习使用,实际使用环境多在Linux下. 首先到相应网站下载red ...

  4. TListView的一些操作

    1,让滚动条滚动的API SetScrollPos int SetScrollPos(     _In_  HWND hWnd,     _In_  int nBar,     _In_  int n ...

  5. Java日志系统框架的设计与实现

    推荐一篇好的文章介绍java日志系统框架的设计的文章:http://soft.chinabyte.com/database/438/11321938.shtml 文章内容总结: 日志系统对跟踪调试.程 ...

  6. 命令行启动win7系统操作部分功能

    control.exe /name microsoft.folderoptions 启动资源管理器的 文件夹属性 选项卡 control.exe /name Microsoft.AddHardware ...

  7. WebForm ASP开发方式、 IIS服务器以及WebForm开发基础

    网页端 B/S两种:(ASP.NET  --网站应用开发技术) WebForm:  微软最先出现的网站开发技术 MVC:  后来开发,为了让java.PHP转过来的开发人员更容易接受使用 客户端 C/ ...

  8. 邮件江湖群狼环伺 U-Mail邮件系统防狼有术

    小时候听过一首儿歌<小兔子乖乖>,里面说到有条恶狼,常常冒充小兔子的“妈妈”,要求小兔 子开门,但小兔子谨守妈妈的训诫,就是不开门,直到辨别出妈妈在窗外的声音,才打开房门.如果我们将一些似 ...

  9. 《Linux内核设计与实现》读书笔记 第十七章 设备与模块

    一.设备类型 1. Unix系统 - 块设备 - 字符设备 - 网络设备 2. 块设备 通常缩写为blkdev,它是可寻址的,寻址以块为单位,块大小随设备不同而不同:块设备通常支持重定位操作,也就是对 ...

  10. C/ C++ 常见编程问题

    C 中容易忽略的问题 1.在C语言中,浮点型变量分为两类: a. 单精度型:类型说明符为float, 在Turbo C 中占4个字节(32位)内存空间,其数值范围为3.4E-38~3.4E+38,可提 ...