要使用mono首先得把它编译起来,当然也可以直接使用mono官网放出的发行包。mono的编译主要分windows和linux两个平台,其他的像IOS和Android,因为我主要是用在服务器开发上,所以没去研究。
Linux下编译mono比较简单,按照官方文档提供的步骤操作就行了,要注意的是你首先要安装一个mono的runtime,主要是编译类库需要,编译mono你首先需要有个编译好的mono,真不知道第一个mono的runtime怎么来的。另外提下,runtime的版本也是有要求的,我尝试编译4.2.1.102的时候提示需要mono3.8的runtime,我使用的ubuntu15缺省能直接get到的版本不够。
Windows下的编译就要复杂点了,要完整的编译整个mono只能使用Cygwin,而且只有32位版,没有64位版,官方也没提供windows64位版的运行库,我尝试过编译64位,编译是成功了,但运行就异常,查了很久,发现LMF都错乱了,基本很难靠自己解决了,就放弃了。
使用Cygwin编译,官方文档里有很详细的步骤说明:
首先安装Cygwin,带上需要的组件,如果你用Cygwin64的话,似乎Cygwin64的缺省组件少东西,需要额外添加,在configure和make的时候会提示,安装Cygwin可以用搜狐的源,比较快:http://mirrors.sohu.com/cygwin
setup-x86.exe --root "C:\cygwin" --quiet-mode --packages autoconf,automake,bison,gcc-core,gcc-g++,mingw-runtime,mingw-binutils,mingw-gcc-core,mingw-gcc-g++,mingw-pthreads,mingw-w32api,libtool,make,python,gettext-devel,gettext,intltool,libiconv,pkg-config,git,curl,libxslt
然后是从github获取mono的源码,建议直接使用git获取,不要下载zip包,zip包里没有依赖的外部项目,还有要获取release版本,获取最新版本可能是编不过的,比如我获取的是4.2.1.102
git clone -b "mono-4.2.1.102" --recursive --depth 1 https://github.com/mono/mono.git mono-4.2.1.102
编译过程需要使用mcs编译器,所以先安装一个Mono,然后在Cygwin设好PATH,我的mcs路径在从c:\mono\mono\bin里
PATH=/cygdrive/c/mono/Mono/bin:$PATH
然后开始配置
./autogen.sh --prefix=/cygdrive/c/mono/Mono --host=i686-pc-mingw32
然后是make编译,等着完成就行了,过程稍微有点长,看你机器的性能了
Cygwin能进行完整的编译,包括类库,但编译好的东西要用都要带个Cygwin的dll有点不爽,mono也能用vs编译,但仅限运行库,类库不行,不过对我的应用来说也够了,vs的解决方案位置在msvc/mono.sln,用vs打开就能编译了,原始的生成配置都是生成动态库的,我个人喜好喜欢静态库,所以就设置了下编译静态库
说到编译成静态库,这里有个问题,mono的c#虚拟机的gc可以有2个选择,一个是Boehm的,一个是mono自己的sgen,用编译指令就可以设置使用那个,sgen目前性能和Boehm差不多了,内存使用上还更优秀点,所以mono现在缺省都是用sgen了,我一开始使用的是Boehm,在动态库中没问题,但在静态库版本执行gc时会abort:"Collecting from unknown thread."。换用了sgen就没这个问题了。