基于.NET/C#开发跨平台 Windows Phone 7、iPhone 及 Android 应用程序

阅读数:4812 2010 年 10 月 28 日

在近日举办的 Modern .NET DDD Conference 会议上,Chris Hardy 在他的演讲中展示了如何基于.NET/C#,开发面向 Windows Phone 7,iPhone 及 Android 三个平台的应用程序,以及其中的注意事项。

首先 Chris 列举了三个平台上使用的工具及框架等周边环境:

  Windows Phone 7 iPhone(MonoTouch) Android(MonoDroid 预览版)
操作系统 Windows Mac 跨平台
开发工具 Visual Studio 2010 MonoDevelop VS 2010 / MonoDevelop
设计工具 Expression Blend 4 Interface Builder XML 文件 / DroidDraw
开发框架 Silverlight for WP Silverlight 3 的超集 Silverlight 3 的超集
社区情况 极好 较好 尚早

MonoTouch 是 Novell 公司推出的基于 Mono 的 iOS 应用程序开发套件,并可以将应用程序发布至苹果应用程序商店。Mono 是一款基于 ECMA 标准开发的.NET 运行环境,使用 JIT(Just-in-Time)编译方式来执行 IL 代码,不过由于 iOS 设备的限制,MonoTouch 使用了 AOT(Ahead-of-Time)编译方式,直接将原生代码部署至 iOS 设备(iPhone,iPhone 4,iPad)上。MonoTouch 还提供了一个 Linker,它会将 SDK 及程序代码中真正使用到的部分静态链接至应用程序中,从而削减了应用程序的体积。使用 MonoTouch 开发出来的应用程序可以在 iOS 设备上独立运行,这是因为 MonoTouch 会将一个运行时放入应用程序内部的原因。据 Chris 称,这会给应用程序的体积带来大约 6MB 的增长。

使用 MonoTouch,.NET/C#程序员可以利用现有的知识进行开发,能够使用反射、泛型、LINQ、Lambda 等各种高级的.NET/C#特性。面向原生 API 的绑定存放在 monotouch.dll 中的 MonoTouch 命名空间下,并与 CocoaTouch(即用于 iOS 开发的原生 Objective-C 框架)的命名空间映射。在绑定时,MonoTouch 不是一味地直接暴露出 Cocoa Touch 的功能,而是在一定程度上将它的 API 改写为更倾向于.NET 程序员的形式。例如 UIView 的 Frame 属性为 System.Drawing.RectangleF 类型,而不是 Cocoa Touch 中原本使用的 CGRect。对于一些如 NSArray 这样的类型,MonoTouch 也在合适的地方将其转化为强类型的数组。在调试方面,MonoTouch 使用了 Mono 的 Soft-Debugger,支持在模拟器、真机,甚至通过 WIFI 进行调试。

MonoDroid 是针对 Android 系统的应用程序开发套件,大体和 MonoTouch 相同,目前正处在预览发布阶段,只有少量早期预订的用户拿到了 SDK。

据 Chris 称,有了 MonoTouch 和 MonoDroid 便可以复用相当部分的代码,包括现有的开源项目,如 Json.NET FlickrNet XnaTouch 。XnaTouch 是一款基于 MonoTouch 的 XNA 框架实现,简化 XBox 及 WP7 上的游戏向 iOS 上的移植工作。不过在复用时并不能共享二进制文件,而必须针对不同的平台重新编译代码。

在 UI 部分,三个平台各有原生的解决方案。除了 WP7 以外,iPhone 和 Android 分别使用 MonoTouch 及 MonoDroid 提供的原生 API 的 C#绑定进行开发。例如,MonoTouch 进行 UI 开发时使用的是 iOS 标准的应用程序的架构,包括其 MVC 驱动方式。开发人员可以通过 Interface Builder 编辑 XIB 文件,MonoTouch 会自动根据 XIB 的内容在局部类中生成 C#代码,所有的 outlet,action 等元素都会在代码中得到体现。

Chris 也提到了其他一些必须针对平台编写特定代码的地方,例如在文件的存储上,MonoTouch 和 MonoDroid 可以直接像本地路径写入数据,而在 WP7 上则必须使用独立存储:

    void SaveLocal(string data)
    {
#if (MonoTouch || MonoDroid)
        File.WriteAllText(_localPath, data);
#elif WINDOWS_PHONE
        using (var appStorage = 
            IsolatedStorageFile.GetUserStoreForApplication())
        {
            var file = appStorage.OpenFile(_localPath, FileMode.Create);
            FileExtension.WriteAllText(file, data);
        }
#endif
    }

同理,使用 WebClient 获取数据时,在 MonoTouch 及 MonoDroid 上可以直接调用 DownloadFile 相关方法来下载文件,而在 WP7 中,则需要使用 OpenRead 相关方法处理二进制数据流。

Chris 在演讲中演示了一个跨平台的 Twitter 应用程序的开发过程,您可以在他的博客上访问WP 7 和MonoDroid 的开发录像,以及完整的幻灯片内容。Chris 与他人还合著了一本讲解 MonoTouch 开发的书籍。此外,在国内技术社区也有关于 MonoTouch 的内容,如老赵在博客上描述了在虚拟机中安装 Mac OSX 雪豹操作系统以及利用 Visual Studio 开发 MonoTouch 应用程序的方式(上)。

收藏

评论

微博

发表评论

注册/登录 InfoQ 发表评论