http://www.sumnercountychat.com

Mono在Linux上的开发与实践札记

  近期有个政坛项目,顾客钦定服务器程序必得跑在Linux下边,于是乎大家那帮Linux新手立马开装Linux系统并配置Mono景况。因为对Linux实在不熟的由来,故在RedHat Enterprise Linux 6中一向未有将MonoDevelop跑起来,于是团队中有同事建议“干脆转Java平台算哒”,哎呦,这么“反动”的主张必得得镇压在发芽状态。好啊,笔者鲜明有稍许的私家主观因素作祟,但究竟依旧必要些堂皇冠冕理由的:

  因为集团现成全体成品都以基于.NET平台,绝大数开采职员也独有.NET开拓经历,那样的阳台迁移是个特别大资金的风云,并且关系集团的豆蔻梢头切软件开垦的方向性转移,绝对不能贸然行事。

  小编一向看好将具备成品统如日中天支付平台,最后将各条产品线全体依照本人研究开发的插件框架,假诺并行Java和.NET多少个开垦平台,个中涉及的开拓量和代码移植、版本同步、双向宽容……想想正是一个过多而麻烦的工程,那样的焦油坑绝对要制止陷入进去。

  近期的主题素材其实只是团队对Mono on Linux的经验不足,那些标题还不一定严重到要求迁移开荒平台,起码大家还会有Mono那样意气风发根救命稻草。所以,大家要做的只是尽快熟练Linux和堆放Mono on Linux上边包车型大巴某些移植经验,当然,作者明白把C#代码移植过去由此Mono的编译并简单,难题在于某些API的细节差距和一些代码合同需求经过一定时期的阅历来躲避有些小陷阱,不过,那一个都以足以解决的。

  Mono以往新型稳定版本是2.10.2,对C# 4.0曾经支撑的很完整了。并且前面异常快会有ASP.NET MVC3的完全兑现,纵然从未观望对ADO.NET EntityFramework的支撑安插,但是,大家已经达成过以DataSet为多少载体的数额访谈框架,所以完全可以借鉴ADO.NET EF的宏图思想去完结二个适度ORM数据引擎,当然这几个业务得推后一点才有生命力去做,可是思考正是风度翩翩件多么风趣的作业呀。

  上面晓之以理,上面就该动之以情了,你看本次的Android版的警务通就是用Java来搞的,未有接纳极度MonoDroid吧,为什么?因为Mono for Android实在太不成熟了,用它写的顺序的无论是体积依然运转功效都无法跟人家比,确实不在二个阶段。一句话来讲,量入为出、具体相比。

  部门会就餐之后,我决定从这一个类型组起来逐年扩充双机开辟,每人配两台微型计算机,后生可畏台装Windows、风度翩翩台装Linux,在Windows中用VS开垦,调节和测验通过后签入SVN中,再在Linux中签出使用MonoDevelop进行一回单元测量试验,不用设想机,少年老成切原生态同步开采,升高每一个开垦职员对Linux的熟知和积攒对Mono on Linux的支出经历,于公于私都以丰富给力的!

  EnclaveHEL6中MonoDevelop装不上,咱没武术跟它耗,赶紧上OpenSUSE和CentOS,那七个都是MonoDevelop官方网址的主荐平台,果然很给力极其的顺。上面是明天(二〇一二-7-5)将有些后台代码移植到Mono on Linux中的实行札记:

  举世出名Linux的文件系统路线是分别朗朗上口写的,所以在代码中一定不能够简单拼凑文件路线,推荐应用 System.IO.Path 类中的相关方法开展路线操作,别的,对于文本中的分行要动用 Environment.NewLine属性,大概 AppendLine 之类的法子来处理以躲避操作系统的差异。

  防止选择Win32 API的P/Invoke操作,那一点幸亏Linux上只是跑服务器端代码,所以基本不会涉嫌。

  前些天移植的多个类库时,只蒙受下边三个难题花了几许时日,就运维测量检验通过了,好爽。

  如日方升、在.NET 4.0的System.Type中新增添了这一个GetType(…)方法重载:

public static Type GetType(string typeName, Func<AssemblyName, Assembly>assemblyResolver, Func<Assembly, string, bool, Type> typeResolver, bool throwOnError)

  作者的代码是如此使用的:

public static Type GetType(string typeFullName)
{
     if(string.IsNullOrWhiteSpace(typeFullName))
         return null;
     return Type.GetType(typeFullName, assemblyName =>
     {
         Assembly assembly = ResolveAssembly(assemblyName);
         if(assembly == null)
             assembly = LoadAssembly(assemblyName);
         return assembly;
     }, null, false);
}

图片 1

郑重声明:本文版权归澳门新葡萄京娱乐网站所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。