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

@kangaroo This is awesome! Thank you so much for doing it! I’ll start reviewing it in the morning.

今天发现,@kangaroo修改后可在OS X上编译的版本已被合并到CoreCLR的主分支上(详见Merge pull request #117 from kangaroo/osx),直接git签出就能编译了。如果编译时出现"not found for architecture x86_64"的错误,需要删除binaries文件夹之后重新编译。

编译成功之后,你会在 binaries/Product/amd64/debug 文件夹中看到下面三个文件:

corerun		libcoreclr.dylib	libmscordaccore.dylib

紧随编译成功的喜悦,一个冲动油然而生——用这个自己编译出来的CoreCLR运行.NET程序。

要运行.NET程序时,发现 binaries/Product/amd64/debug 中少了一个重要的文件——mscorlib.dll,不知道编译时为什么没生成。

@kangaroo也知道了这个问题,将这个文件发给了我(如果你需要,可以在这里下载),于是将这个文件复制到 binaries/Product/amd64/debug 中。

接下来是准备要运行的.NET程序,突然想到之前在阅读园子里的博文用CIL写程序:你好,沃尔德时,照着手工敲出过一段.NET控制台应用程序的IL代码(代码如下),何不就用这个呢?

.assembly extern mscorlib
{
.ver 4:0:0:0
.publickeytoken = (B7 7A 5C 56 19 34 E0 89)
}
.assembly 'HelloWorld'
{
.custom instance void class [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::'.ctor'() = (
01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78
63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 ) .hash algorithm 0x00008004
.ver 0:0:0:0
}
.module HelloWorld.exe
.method static void Main()
{
.entrypoint
.maxstack 1 ldstr "Hello, world!"
call void [mscorlib]System.Console::WriteLine(string) ret
}

然后用Mono的ilasm将il代码生成为程序集HelloWorld.exe:

ilasm HelloWorld.il

接着将HelloWorld.exe复制到 binaries/Product/amd64/debug 中,现在这个文件夹中就有了5个文件:

/git/dotnet/coreclr/binaries/Product/amd64/debug
HelloWorld.exe corerun libcoreclr.dylib libmscordaccore.dylib mscorlib.dll

激动人心的紧张时刻到来了,我们来用自己编译出来的CoreCLR运行HelloWorld.exe试试:

$ ./corerun HelloWorld.exe
Hello, world!

耶!成功!

虽然这只是一小步,虽然实现在Mac上开发.NET应用任重而道远,但是.NET开源带来的精彩已经到来!

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

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

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

  2. Mac OS X上用CoreCLR运行一个真正的.NET控制台程序

    这个真正的控制台程序来自corefxlab,名叫CoreClrHelloWorld,是一个跨平台的.NET控制台演示程序,可以显示微软.Linux.苹果的logo. CoreClrHelloWorld ...

  3. 如何解决虚拟机Mac OS X 不支持二进制编译问题()

    本文将着重解决在使用VMware 11安装Mac OS虚拟机出现”Mac OS X 不支持二进制编译.若要运行 Mac OS X 主机上需要一个 VMware Workstation 支持英特尔 VT ...

  4. Mac OS X上尝试编译CoreCLR源代码

    CoreCLR登陆GitHub之后,体验CoreCLR首当其冲的方式就是在自己的电脑上编译它,昨天分别在Windows与Linux上成功编译了CoreCLR,详见: 1)Windows上成功编译Cor ...

  5. 如何在Mac OS X上安装 Ruby运行环境

    对于新入门的开发者,如何安装 Ruby和Ruby Gems 的运行环境可能会是个问题,本页主要介绍如何用一条靠谱的路子快速安装 Ruby 开发环境.此安装方法同样适用于产品环境! 系统需求 首先确定操 ...

  6. Mac OS X上安装 Ruby运行环境

    环境   对于新入门的开发者,如何安装 Ruby和Ruby Gems 的运行环境可能会是个问题,本页主要介绍如何用一条靠谱的路子快速安装 Ruby 开发环境.此安装方法同样适用于产品环境! 系统需求 ...

  7. Sqlite在Windows、Linux 和 Mac OS X 上的安装过程

    一:在 Windows 上安装 SQLite 1,下载 请访问SQLite下载页面http://www.sqlite.org/download.html,从Windows 区下载预编译的二进制文件.需 ...

  8. Mac OS X上使用Wireshark抓包

    Wireshark针对UNIX Like系统的GUI发行版界面采用的是X Window(1987年更改X版本到X11).Mac OS X在Mountain Lion之后放弃X11,取而代之的是开源的X ...

  9. Mac OS X 上安装 ASP.NET 5

    在Mac OS X Yosemite 10.10.3 中搭建第一个 ASP.NET 5 Web 项目 终于有时间在 Mac 上安装一下 ASP.NET 5,网上有许多教程,但是多数的时间比较早了,版本 ...

随机推荐

  1. Hadoop MapReduce编程 API入门系列之小文件合并(二十九)

    不多说,直接上代码. Hadoop 自身提供了几种机制来解决相关的问题,包括HAR,SequeueFile和CombineFileInputFormat. Hadoop 自身提供的几种小文件合并机制 ...

  2. JavaScript 基础(七) 箭头函数 generator Date JSON

    ES6 标准新增了一种新的函数: Arrow Function(箭头函数). x => x *x 上面的箭头相当于: function (x){ return x*x; } 箭头函数相当于匿名函 ...

  3. Brn系列网上商城数据库说明文档

    单店版BrnShop_1.9.351数据字典:点击下载 多店版BrnMall_1.9.496数据字典:点击下载 有对网上商城程序设计感兴趣的朋友,欢迎加入QQ群:235274151,大家可以交流下!

  4. VC++ AfxBeginThread 与 CreateThread 的区别

    简言之:AfxBeginThread是MFC的全局函数,是对CreateThread的封装.    CreateThread是Win32 API函数,前者最终要调到后者.具体说来,CreateThre ...

  5. Delphi 字符数组存入文件

    TDMSRequestBuffer=object    Head:TDMSHead;    Data:array[0..2047] of char;    DataSize:Integer;    p ...

  6. Spring 依赖注入的方式

    Spring 支持3中依赖注入的方式 1.属性注入  通过setter 方法注入Bean的属性或依赖的对象. <bean id = " " class = " &q ...

  7. subprocess添加超时功能

    def TIMEOUT_COMMAND(command, timeout): """call shell-command and either return its ou ...

  8. LeetCode(一)

    数据流的中位数 class MedianFinder { private Queue<Integer> maxHeap = new PriorityQueue(new Comparator ...

  9. KMP字符串匹配算法

    static void Main(string[] args) { var d = KMP("abcabcadabc55abcabcadabc55", "abcabcad ...

  10. RAID配置

    一.madam -a      检测设备名称 -n      指定硬盘数量 -l       指定raid级别 -C     创建 -f       模拟硬盘故障 -r      移除硬盘 -a    ...