Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为了最大限度地提高Mono代码的可移植性,我应该注意哪些限制?_C#_Mono_Xamarin.ios_Portability_Xamarin.android - Fatal编程技术网

C# 为了最大限度地提高Mono代码的可移植性,我应该注意哪些限制?

C# 为了最大限度地提高Mono代码的可移植性,我应该注意哪些限制?,c#,mono,xamarin.ios,portability,xamarin.android,C#,Mono,Xamarin.ios,Portability,Xamarin.android,我对使用Mono编写一些跨平台代码感兴趣,目的是针对移动iOS和Android运行时 我仔细阅读了Mono和MonoTouch网站,但没有看到任何特别建议不要使用的方法,也没有看到应该避免使用的Mono挂钩。然而,这似乎有点太好了,不可能是真的 为了确保代码的最大可移植性,我应该注意这个项目的哪些限制?API方面,当使用MonoTouch或Mono for Android(M4A)时,您会得到非常相似的基类库(BCL),因为两者共享相同的移动配置文件(它最初基于Silverlight配置文件,并

我对使用Mono编写一些跨平台代码感兴趣,目的是针对移动iOS和Android运行时

我仔细阅读了Mono和MonoTouch网站,但没有看到任何特别建议不要使用的方法,也没有看到应该避免使用的Mono挂钩。然而,这似乎有点太好了,不可能是真的


为了确保代码的最大可移植性,我应该注意这个项目的哪些限制?

API方面,当使用MonoTouch或Mono for Android(M4A)时,您会得到非常相似的基类库(BCL),因为两者共享相同的移动配置文件(它最初基于Silverlight配置文件,并经过增强以使用更多FX 4.0 API)

这是许多常见代码。BCL的差异很小,但确实存在一些差异,主要是因为在iOS设备上运行需要一些折衷,这会产生一些问题

BCL之外,MonoTouch和M4A都为其平台提供绑定。例如,MonoTouch提供了绑定大多数iOS(基于C或Objective)API的MonoTouch.dll。该部分在Android的Mono上不起作用(M4A提供的Android绑定也是如此)


在许多情况下,最不同的方面是用户界面,有几种方法,其中许多是基于MVC的(例如)使开发人员能够更轻松地实现这一点,同时为每个平台提供本机外观。

我已经使用MonoTouch(iOS)、Android的Mono和Windows Phone 7的Silverlight完成了一些跨平台的.Net编码。我发现一个好方法是将我的代码基于Silverlight运行时,因为Mono也支持大部分这一功能

如果你只想针对iOS和Android,那么它们之间的主要区别在于UI。只要你远离任何与UI相关的东西,那么你的代码在这两个平台上都应该运行良好


这两种平台之间有一个主要区别:在iOS上,您的代码是预编译的,因此对反射的支持有限。大多数东西都可以正常工作,但在iOS上使用大量反射的代码时应该小心。

您尝试过吗?这不是最终的解决方案,但它可能会确保您在Mono-ru上具有良好的可移植性很多时候。

除了UI之外,要养成习惯,确保外部依赖项具有跨所有所需平台运行的变体,或者准备好将它们排除

对我来说,陷阱是:

  • 压缩在silverlight中不可用,如果需要,请使用sharpziplib 需要(我知道你的目标不是silverlight,只是以防万一。)
  • 序列化-Protobuf net是您的朋友
  • 存储-这是最棘手的。您使用的是常规IO还是 隔离存储,或一个平台上的一件东西和另一个平台上的另一件东西 另外,mono.sqlite几乎在任何地方都能工作,除了在 silverlight,那么就这样做吧,并制定一个应急计划 silverlight,如果需要的话
  • 微软发明的-忘了这些东西吧。WCF,实体框架, SQL-CE,LINQ到SQL,等等。Mono完美地完成了.NET的核心功能,但在外围技术方面非常零散,我认为这些技术没有多大价值

话虽如此,我发现可移植性令人惊讶地没有痛苦。事实上,它是如此的好,以至于我能够在一两天内将用于桌面的代码转移到移动设备上,尽管之后我不得不花费大量时间进行优化。仅仅因为代码是可移植的,并不意味着它在所有平台上的性能都相同!我认为是这样的s最好在性能最敏感的平台上进行绿地编码,IMO认为这是monodroid,因为它具有移动设备上JIT、跨VM垃圾收集等复杂性。

MoMA将在现有的.NET应用程序上工作,并报告Mono不支持的内容(wrt到MS框架)但是,它还没有报告MonoTouch或Mono for Android支持什么。而且它也无助于分析Mono应用程序不适用于任何移动平台。好吧,如果你在MonoDevelop/SharpDevelop上从头开始一个应用程序,那么我想过渡应该会更容易,因为你只处理unices,但我理解你的意思,我不认为MoMa真的提供了这一点。在iOS上反射很好。但是反射。发射与任何其他代码生成技术一样,不受支持,因为iOS平台上不允许JITting。