MonoMac是面向Mac OSX API的C#绑定,其API设计主要受到了MonoTouch的启发,后者可以基于Mono开发原生的iOS应用程序。MonoMac套件的目标之一,也是发布独立的 .app应用程序,让最终用户摆脱对Mono的依赖。MonoTouch的成功则是一个良好的基础,于是Mono开始将Cocoa API使用C#和.NET世界中的模式与惯例用法表现出来,并提供开发人员整套Cocoa应用程序的开发工具。
MonoMac是面向Mac OSX API的C#绑定,其API设计主要受到了MonoTouch的启发,后者可以基于Mono开发原生的iOS应用程序。MonoMac套件的目标之一,也是发布独立的 .app应用程序,让最终用户摆脱对Mono的依赖。MonoTouch的成功则是一个良好的基础,于是Mono开始将Cocoa API使用C#和.NET世界中的模式与惯例用法表现出来,并提供开发人员整套Cocoa应用程序的开发工具。
Mono之父Miguel de Icaza表示,.NET从一开始便设计成为一个易于互操作的框架,他对于跨运行时及框架的无缝通信提供了许多高级的支持,这对创建Cocoa API的绑定很有帮助。MonoMac的设计原则与MonoTouch非常接近,它充分考虑到.NET程序员的习惯需求,例如使用Lambda表达式和委托来表示Objective-C API中的“block”。
Cocoa的API由两部分组成,一部分是基于C的API,例如AudioToolbox、CoreGraphics、CoreFundation和CoreText,它们利用P/Invoke的方式直接封装成C#类。而在UI层面上则是大量的Objective-C编写的API,例如Foundation和AppKit。MonoMac提供了新的一套新的绑定引擎MonoMac.ObjCRuntime,以及btouch绑定生成器。
MonoMac仅仅是一套用于开发OSX应用程序的类库。MonoMac团队同样发布了一套基于MonoDevelop的开发工具,其生成结果便是Mac OS下的app应用程序包。此外,Mono 2.8还包含了一个新工具叫做“Mono打包器(bundler)”。这个打包器可以检查你的.NET应用程序,并将其依赖的部分打包在一起。这个技术如今已经用于OSX版本的Banshee项目(一款基于Mono和Gtk#的播放器),这样发布后的应用程序无需在目标机器装有Mono框架。
MonoMac使用MIT X11许可协议发布。源码分为两部分:monomac和maccore,都可以在GitHub上获得。前者包含了面向MacOS的绑定,而后者则包含了MonoMac和MonoTouch共用的代码。
看完上面这段介绍,聪明的你知道主角是MonoMac了,下面我向大家介绍下开发环境的搭建和第一个Helloworld程序的开发:
第一步:需要有一台Mac 电脑,可以采用虚拟机搭一个也行,为了更好的操作体验还是准备一台Mac的机器比较好,2011年1月14日苹果优惠打折,毫不犹豫的就在香港apple商店上下单买回来一个MacBook Air(CPU:1.86 GHz Intel Core 2 Duo, 4GB RAM,128G SSD),价格10000HK$。
第二步:Mac开发环境Xcode和Monodevelop的安装,当然在安装mac系统时,如果选择IT用户,很多开发系统也就自动安装好了,比如jdk、maven、svn,python的环境, 然而不是所有的软件开发环境都会安装好,比如xcode 、ios sdk 。
- 到Apple's developer program,选择 Mac 和iOS 开发,登陆后就可以下载Mac开发工具,里面包括Xcode,这个工具是免费的,这点比微软的政策好啊,就是要善待开发者。Xcode的环境和 Visual Studio 非常的相像,有Visual Studio的使用经验非常容易入门.。
下载完软件,点击运行如图:
上边的那幅图中有xcode和IOS SDK的安装说明,下面那幅图是软件安装的图标,点击下边的Xcode and iOS SDK开始安装。
一路继续就可以了
- 下载和安装 MonoDevelop 2.4, 这是Mono的一个IDE ,是开源和免费的,他要求 Mono 2.4 和 GTK。 Mono安装过程十分普通,而MonoDevelop的安装方式对于Windows用户可能有些特别。在加载了dmg文件以后,会弹出这样一个界面:
根据提示,此时您只需要将MonoDevelop的图标拖至右侧目录中就可以了。
- 下载和安装 MonoMac。 MonoMac的插件安装参考http://www.mono-project.com/MonoMac#Obtaining_MonoMac也很简单。安装完MonoMac的插件,在MonoDevelop的新建项目的对话框上就有了MonoMac的项目类型。
下面我们就用MonoDevelop和Xcode一起使用来完成第一个Mac Helloworld程序的开发,下面的内容主要基于这篇博客http://www.satter.org/2010/09/net-development-for-os-x.html,所有用到的图片也是这篇博客的,我只是按照这篇博客的内容熟悉了一下开发环境,其中也碰到了一些问题,我会以红色的文字进行标识,相信也是你体验的时候会碰到的问题,不过这篇博客需要FQ才能阅读,你懂的:
首先需要创建一个MonoMac的工程,我们命名为HelloMonoMac:
MonoDevelop是英文的,是因为在中文的Mac系统下,MonoDevelop界面上的中文会乱码,通过MonoDevelop—〉Preferences –>Visual Style –>General—>User Interface Language 选择English就可以解决。
创建的项目有下面文件:
- info.plist - 一个文本文件包含应用程序的一些属性字符串,类似于.NET项目的AssemblyInfo.cs,具体参考 reference guide.
- Main.cs - Main.cs里包含了项目的启动代码.
- MainMenu.xib - 菜单资源和代码文件. 具体参考Interface Builder User Guide
- MainWindow.xib - 主窗口的界面文件,具体参考Interface Builder User Guide 而MainWindow.xib.designer.cs文件则是MonoDevelop根据xib文件中的标记所自动创建的C#代码,在绝大部分情况下我们不会去修改它。
MonoMac使用Xcode的模式构建UI应用,Xcode使用MVC模型。XIB文件中包含UI和你的代码,也就是View。你的控制器和模型用.NET来写,也就是你必须使用Xcode来构建UI,因此必须安装Xcode。
使用Interface Builder进行界面的布局,在MonoDevelop的项目上双击MainWindow.xib文件,便会打开Interface Builder。我的使用过程中却发生这样的一件事,无论怎么双击也打不开Interface Builder,开始以为是MonoDevelop的问题,就使用Xcode创建一个项目,也是一样的问题,最后是通过下面的方法解决的:通过Finder找到Developer\Applications\Interface Builder 先运行Interface Builder,就可以了。
下图有4个窗口,左为Library窗口(近似于VS中的Toolbox),可以通过拖拽方式将控件加入到窗口里去;中间上方是可视化的UI编辑器,下方则是对象管理器,显示了界面中定义的对象;右侧便是用来修改属性的Inspector窗口(近似于VS中的Properties窗口):
在Library里找到NSButton,把它拖到中间的UI 编辑器窗口上,修改“Button”为“点击我”:
下面添加一个NSTextField,方法和NSButton类似,我们要做的一件事就是按下按钮的时候,修改TextField的文本显示:
下一步是建立UI和控制器之间的接口,首先是一个更新文本的属性,然后是通过一个事件 控制按钮的点击,控制器来我们使用C#代码进行编写。到Library找到MainWindowController
并在下方下拉框中选取Outlets,并使用下方加号添加一个id,修改为NSTextField:
下一步是建立label和NSTextField之间的映射,这是个比较有趣的操作。回到MainWindow.xib窗口,选中“File’s owner”,在属性窗口中选择第五个,一个向右的箭头按钮。再将label右侧的小圆点拖动至NSTextField,当你释放鼠标你要看你NSTextField标签所联系在一起:
快完成了。下一步是在Interface builder建立一个按钮点击事件。 到Library的窗口。确定它仍然显示MainWindowController。选取Action。点击“+”和增加buttonClicked 类型为 NSButton。在属性窗口中,您应该看到一个新收到行动称为buttonClicked。把它和在画布上的按钮按照标签相同的方法建立关联。
最后一步是保存我们的界面修改结果,这一步很重要哦,因为MonoDevelop是根据xib的内容,自动生成了相关的C#代码。
现在我们回到MonoDevelop项目中,将下面的代码加入到MainWindow.Controller.cs文件。关键是添加一个方法——buttonClicked,也需要NSButton。程序就会按钮点击的时候触发请求该这个方法:
int count = 0;
partial void buttonClicked(NSButton sender)
{
label.StringValue = string.Format("Button clicked {0} times.", ++count);
}
此时可以选择菜单Run - Run,或直接使用快捷键Command(即Win键) + Alt + Enter便会编译项目,这样你就可以看到这个程序运行起来了。