在MONO 2.8.2中遇到的一些兼容性问题
最近公司的一个项目因为要接入腾讯开放平台,需要转移到mono环境中,在做mono兼容性调整的时候遇到了一些问题,记录下来跟大家分享一下。
首先,要把.NET Framework的应用迁移到mono平台,一定要借助这个软件:MoMA。Mono Migration Analyzer (Moma)是一个用于开发者使用的MS .net下开发的应用程序迁移到Mono平台的不兼容性检测工具。工具通过分析.dll或者.exe程序集的代码是否符合ECMA CLI,大家都知道符合ECMA CLI标准的.net 程序可以运行于MS .net和Mono平台。这个工具可以帮助我们生成一个很详细的mono兼容性文档,可以帮助我们调整程序的兼容性。
不过这个工具的分析结果也不完全正确,一些实现方式MoMA提示不兼容,但在mono中是可以正常使用的。
遇到的一些不兼容的问题:
1、项目是使用JS来调用Web Services来做的,用xsp做WEB服务器端的时候发现如果Web Services接口中有使用可空参数的时候,不能正常使用,即使回传的值不是null,接口依然只能接收到null值。
2、如果使用nginx通过调用mono的fastcgi来做WEB服务器,这种方式将不支持Web Services。Apache的mod_mono暂未做测试。
3、在mono环境中,TimeZoneInfo.Local无法使用,这是mono的一个BUG。
4、MySQL Connector的mono版本中有2个类库,一个是.net 2.0,一个是.net 4.0。如果把2.0的类库也用MoMA分析,会提示很多不支持的方法;如果你是用nginx的fastcgi解析.net程序,需要使用4.0的MySQL类库;而在xsp中,使用2.0的类库就好了。
5、如果你的操作系统是SLES,建议获取mono的源码编译完装,会让你省去很多事情。
6、在SLES编译XSP源码时,你系统的sqlite3的版本号要大于3.5.0,否则编译不过。
7、把项目转到mono平台,风险还是非常大的,非常多第三方类库不能直接在mono平台中使用,如Combres/log4net/Quartz.NET等等,都需要修改源代码。
暂时先整理这些问题,后面会补上在SLES中部署mono环境的详细过程。
总的说来,mono整体的兼容性是非常不错的,在linux中跑起来很流畅,mono 2.8.2已经不再是玩具了。关于mono,园子里的geffzhang有很深入的研究,有兴趣的同学可以去看看他的博客。
大家也可以关注我的另外一个独立博客: http://blog.moozi.net