老司机学新平台 - Xamarin开发环境及开发框架初探
随着被微软收购,最近一年间,Xamarin的火爆程度与日俱增。免费、更好的VS2015集成、更好的模拟器,甚至,在windows上运行和调试iOS平台程序,让我这样接触了十几年.NET平台的老司机,即使工作中没有直接应用,也忍不住想要一探究竟。
搭建开发环境
工欲善其事,必先利其器。首先,我们需要一个完美的开发环境。要怎么才“完美”呢?我想至少要达到以下三点:
- 完美的Visual Studio集成
- 高效易用的Android和iOS模拟器
- 可视化UI设计
安装Xamarin
Xamarin的Visual Studio插件,现在已经是VS2015各版本的一个可选组件,这方面的安装和集成不是问题。不过,一般VS的安装程序默认安装的都不是最新版本。要升级到最新版本,官方方案是下载那个Xamarin官网的在线安装程序;或者,也可以在已安装Xamarin插件的VS2015的Options/Xamarin/Others中进行升级。
然而,国内的网络环境几乎没法下载更新。变通的办法是,可以用Fiddler这样的工具,抓到Xamarin的安装升级程序企图下载的安装包的URL,然后,通过例如百度云等提供的离线下载功能来下载,然后手动在本地安装。
另一个问题是,上述插件装完,如果企图编译Android项目的,在国内环境,多半会遇到“m2repository目录中相关文件找不到”这样的错误,这是因为,在编译Android项目时,它会企图从google的网站下载这些m2repository的package,然后,国内网络认为并没有google这个网站,大家都懂的,FQ下载速度也不稳定,有时一个package就要几百M。baidu了好一阵,后来找到有某位同学share的一个手动安装包,可惜我不记得出处了,当时只是转存到自己的百度云了,如果,谁知道,请告知,我一定会追加注明。
这里是我的百度云上的一个share,包含了当前最新的Xamarin的Windows和MacOS相关的安装包,和包括上面提到的这个m2repository手动安装包:
http://pan.baidu.com/s/1o8GqgNS 密码:oeoa
Android模拟器
选择一:
Xamarin的VS插件本身包含了官方的Android SDK及其模拟器,不过,在windows平台上,想要较好的性能,模拟器必须配置使用x86核心的CPU,并且安装Intel® HAXM启用硬件虚拟化加速。
选择二:
Visual Studio 2015的安装程序,同时提供了一个基于Hyper-V的Visual Studio Emulator for Android,性能非常不错。不过,Hyper-V和Intel® HAXM不能同时启用。一旦启用Hyper-V,widnows会禁止其他app使用CPU的虚拟化加速功能。所以,只能二选一。
iOS模拟器
iOS模拟器可以在Windows上跑,但是,还是同时需要一台Mac机器,或者一个Mac虚拟机来进行真正的编译和背后的模拟器服务的运行。关于虚拟机安装,建议使用VMWARE,网上相关的文章不少,这里就不过多介绍了。不过,安装最新的Xcode8需要MacOS v10.11.6以上版本。目前最新版本的Xamarin iOS组件可以阉割运行于Xcode7(iOS项目的link选项不能选Don't link,否则无法运行),不过需要Xcode8才能完美运行所有功能。另外,因为开启了Hyper-V以后VMWARE里面不能跑x64的系统,而新版的OSX都只有x64版了,所以,实际上,还是必须关闭Hyper-V才能运行。所以,虽然我很喜欢Visual Studio Emulator for Android,也只能忍痛不用了。
一旦在MacOS中安装好Mono MDK和Xamarin ios组件,并打开MacOS的远程控制允许远程server进行ssh连接,就可以在VS2015中配置iOS模拟器了。配置成功以后,就可以在Xamarin的iOS项目中,指定部署到iOS模拟器了。不过默认情况下,iOS模拟器运行时是运行在MacOS端的,别急,可以安装下面这个iOS Simulator for Windows,让iOS模拟器的UI运行在Windows端。
可视化UI设计
Xamarin的UI设计,现在有两大类别,一类是如Xamarin Android/iOS这样,只能用于特定平台的UI。这类UI几乎是原生Android和iOS的简单封装,所以不具通用性,不过Xamarin本身就已经提供对其很好的可视化设计功能,但是这种UI无法跨平台共享相关的代码;另一类,也是真正能体现Xamarin跨平台价值的,就是基于Xamarin Forms和xaml的UI,这类UI设计可以真正的跨平台共享UI代码,但是,目前,Xamarin提供的Vasual Studio插件还不能进行很好的预览支持。幸好,有一些做得不错的第三方插件,评估了好几个后,觉得最好用的是Gorilla Player,这也是一个免费工具,不过并不开源。
Gorilla Player的运行效果如下,可以在编辑Xamarin Forms的xaml时,在多个device或者模拟器里实时预览UI效果:

至此,开发环境,基本搞定。
Xamarin开发框架的选择
语言和开发工具,是进行任何软件开发的基础。但是,没有好的框架,开发效率往往事倍功半。在决定一个框架之前,我过了一遍这本官方的教程Creating Mobile Apps with Xamarin.Forms Book First Edition,大概列一下面一些要点——如果我自己要设计一个Xamarin的架构,大概会怎么做呢?
- 首先,我一定会选用Portable Class Library(PCL)类型的项目,来共享跨平台代码,包括UI代码;
- 接着,我需要尽可能使用Mvvm模式,来管理UI组件的数据和事件绑定,并且简化UI层的单元测试;
- 然后,UI设计必须基于xaml和Xamarin Forms,方便预览和隔离UI和后端代码;
- 最后,为各种通用功能,比如,SplashPage,Audio Play,DB Access,我会做一些类库,这些类库应该包含PCL格式的共享代码,还应该包含各平台的特殊实现;
评估了一些现有的框架,发现数量不少,不过大多数都还在比较早期阶段,很少有基于Xamarin Forms的,尤其是基于xaml版的Forms。直到找到MvvmCross。他的较早版本也是不支持Xamarin Forms的,不过,现在已经有了MvvmCross-Forms,这个repo的Samples目录包含了很好的示例。
那么,MvvmCross和MvvmCross-Forms提供了哪些框架别的功呢?
- 首先,它的名字都叫Mvvm了,当然,它的所有UI模块都是基于ViewModel的,它强制要求每个逻辑页面都必须有一个ViewModel,甚至连页面跳转时指定的也不是页面名字,而是ViewModel;
- 当结合使用MvvmCross-Forms时,对应于每一个ViewModel,有一个xaml格式的标准Xamarin Forms页面,每个xaml默认绑定到对应的ViewModel;
- 它提供了一个IoC容器实现,替代功能薄弱的Xamarin官方提供的DependencyService,支持Fluent形式的DI配置,更好的管理各种业务Model和Service;
- 它的模版封装了Xamarin官方模版中一般存在于Shared项目的App.cs,提供了一个它自己的封装版本,实现更完善的DI功能;
- 在每个Android、iOS项目中,它的模版提供了一个通用SplashScreen实现和一个Setup.cs文件,用于项目的初始化;
- 它提供了一个很好的跨平台插件架构,已经有很多官方和社区提供的插件,也很容易添加各种跨平台的插件功能;
总体上说,它几乎完美符合我心目中的期望的所有功能,甚至超出预期。使用它的模版进行跨平台开发,在绝大多数情况下,只需要写ViewModel+xaml和对应的业务Model和Service,开发效率极大的得到提升。再结合前面提到的Gorilla Player的xaml多平台UI设计和实时预览功能。整个开发过程,想必是会非常舒畅的!
因为才刚玩了几天,还没深入了解MvvmCross的一些实现细节,上面的介绍,还是更多的停留在表面的功能上,也十分可能有所疏漏,欢迎批评指正。后续有时间会对MvvmCross的架构做一些更深入分析。
Update 1 (2016-10-14): 如何修复VS2015启动时的“XamarainShellPackage did not load correctly”错误?
在一台Win10机器上新装VS2015,并升级Xamarin for VisualStudio后,每次打开VS2015报“XamarainShellPackage did not load correctly”等package不能load错误。修复办法,在控制面板的添加删除程序中手动反安装Xamarin。然后,在VS2015安装程序中修复安装VS2015。最后,手动安装最新的Xamarin for VisualStudio msi安装包。打开VS2015就不再抱错了,新版的Xamarin开发工具也能正常运行了。
Update 2 (2016-10-16): 如何加速Android SDK Manager的下载和更新?
默认情况下,Android SDK Manager从https://dl-ssl.google.com下载所有的更新。但是dl-ssl.google.com在国内常年被墙无法访问,但非https的dl.google.com域名却没有被封,而且速度飞快。我们可以设置Android SDK Manager的选项,强制指定让它从dl.google.com下载所有的更新:

Update 3 (2016-10-24): 离线查看SDK文档的利器,Zeal和Dash,你必不可少的伙伴!
老司机学新平台 - Xamarin开发环境及开发框架初探的更多相关文章
- 老司机学新平台 - Xamarin开发之我的第一个MvvmCross跨平台插件:SimpleAudioPlayer
大家好,老司机学Xamarin系列又来啦!上一篇MvvmCross插件精选文末提到,Xamarin平台下,一直没找到一个可用的跨平台AudioPlayer插件.那就自力更生,让我们就自己来写一个吧! ...
- 老司机学新平台 - Xamarin Forms开发框架二探 (Prism vs MvvmCross)
在上一篇Xamarin开发环境及开发框架初探中,曾简单提到MvvmCross这个Xamarin下的开发框架.最近又评估了一些别的,发现老牌Mvvm框架Prism现在也支持Xamarin Forms了, ...
- 老司机学新平台 - Xamarin Forms开发框架之MvvmCross插件精选
在前两篇老司机学Xamarin系列中,简单介绍了Xamarin开发环境的搭建以及Prism和MvvmCross这两个开发框架.不同的框架,往往不仅仅使用不同的架构风格,同时社区活跃度不同,各种功能模块 ...
- 老司机学Xamarin系列总目录
Xamarin开发环境及开发框架初探 Xamarin Forms开发框架二探 (Prism vs MvvmCross) Xamarin Forms开发框架之MvvmCross插件精选 Xamarin开 ...
- 学习spring1--跟我一起学Spring 3(2)–开发环境配置
http://www.importnew.com/13185.html#spring 首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 我要投稿 更多频道 » - 导航条 - 首页 所 ...
- 【Xamarin挖墙脚系列:Xamarin开发环境配置需求】
原文:[Xamarin挖墙脚系列:Xamarin开发环境配置需求] 前言 因为操作的全是大块头,加大你们的内存,CPU网上飙.... 卤煮的机器配置 最近的版本部署包,百度云离线下载:版本:Xama ...
- Xamarin 开发环境搭建
一.安装环境 打开 Visual Studio Installer,点击修改,然后勾选 "使用 .NET 的移动开发" 二.移动SDK SDK默认被放置在了E:\Program F ...
- C语言老司机学Python (五)
今天看的是标准库概览. 操作系统接口: 用os模块实现. 针对文件和目录管理,还有个shutil模块可以用. 例句: import os os.getcwd() # 返回当前的工作目录 os.chdi ...
- JAVA学习(一):Java介绍及其平台、开发环境的配置与搭建
Java介绍及其平台.开发环境的配置与搭建 1.Java的介绍 Java是一种面向对象的编程语言,具有跨平台.可移植.分布式.简单.可扩展等诸多特性.Java能够进行桌面应用.Web应用.分布式系统及 ...
随机推荐
- CGI与fastcgi与php-fpm与php-cgi的关系
cgi是一个协议,它规定了服务器Nginx会将那些数据传送给PHP-cgi fastcgi也可以说是一个协议.fastcgi是对cgi的性能的一次提高.fastcgi会先启动一个master,解析配置 ...
- eclipse调试
http://blog.csdn.net/u012176591/article/details/23297889
- wpf 触发器理解
(1)属性触发器:其对应的类是Trigger.它在特定关联属性发生变化时被触发.一个属性的更改会在另一个属性中触发即时或动态更改. (2)数据触发器:其对应的类是DataTrigger.它在特定的CL ...
- CustomUI Direct3D9_Sample
刚开始建这个项目的时候编译器报了很多Link2019的错误. 后来添加了一些lib文件才解决,参考 缺少.lib文件导致的Link2019 解决方案汇总 ==================== ...
- 从零开始山寨Caffe·伍:Protocol Buffer简易指南
你为Class外访问private对象而苦恼嘛?你为设计序列化格式而头疼嘛? ——欢迎体验Google Protocol Buffer 面向对象之封装性 历史遗留问题 面向对象中最矛盾的一个特性,就是 ...
- 使用sublime text 开发node.js
http://blog.csdn.net/jwkfreedom/article/details/8450005 本机环境: windows7 64位 1. 下载安装sublime text, 不用注册 ...
- img只显示图片一部分 或 css设置背景图片只显示图片指定区域
17:14 2016/3/22img只显示图片一部分 或 css设置背景图片只显示图片指定区域 background-position: 100% 56%; 设置背景图片显示图片的哪个坐标区域,图片左 ...
- hdu1532网络流
(双倍经验题) 第二次写dinic模板,居然一遍写对了,而且短了不少O(∩_∩)O~ #include <cstdio> #define INF 2147483647 int n,m,an ...
- 再记录一下如何配置oracle instantclient
这问题遇到很多次,每次重装系统就遇到一次,却总是搞半天才搞定. 今天再次花费几个小时解决,终于有一个清晰的认识必须记录一下. 一.下载解压,不建任何目录,直接复制tnsname.ora过来.(当然也可 ...
- [Android]依赖注入框架google的dagger
分享一下Android依赖注入框架--Google升级版Dagger2框架 Google的Dagger2是对上一版squareup的Dagger改版,话不多说直接上项目代码. Dagger2源码 Da ...