【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

Mono 向 Mac OS 应用程序开发示好

  • 2010-10-26
  • 本文字数:1791 字

    阅读完需:约 6 分钟

Mono 正在努力改进各个平台上的使用体验。近日 Miguel de Icaza 在博客上宣布 MonoMac 发布了新的版本 MonoMac 是面向 Mac OSX API 的 C#绑定,其 API 设计主要受到了 MonoTouch 的启发,后者可以基于 Mono 开发原生的 iOS 应用程序。MonoMac 套件的目标之一,也是发布独立的 .app 应用程序,让最终用户摆脱对 Mono 的依赖。

多年以前,Geoff Norton 创建了 CocoaSharp ,这是第一套面向 Cocoa API 的.NET 绑定。从那时起,Mono 用户开始尝试利用.NET 客户端调用 Objective-C 的 API。几年下来,也出现了其他几个设法集成 Objective-C 和.NET 语言的框架,它们各有利弊。一年多前 Mono 希望可以将这些竞争对手结合起来,可惜最后无疾而终。

之后 MonoTouch 的成功则是一个良好的基础,于是 Mono 开始将 Cocoa API 使用 C#和.NET 世界中的模式与惯例用法表现出来,并提供开发人员整套 Cocoa 应用程序的开发工具。在设计方面,MonoMac 参考了《 Framework Design Guidelines 》一书中总结出的设计决策及建议,主要包括:

  • 减少意外
  • 基于 C#及其他.NET 类库
  • 降低出错的可能
  • 增加开发乐趣
  • 提高生产力,节省开发人员时间
  • 利用一切.NET 方面的知识

Miguel 表示,.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 绑定生成器。btouch 绑定生成器接受 C#语言形式的 API 约定,自动生成一个绑定,例如 MSActionCell:

复制代码
[BaseType (typeof (NSCell))]
interface NSActionCell {
[Export ("initTextCell:")]
IntPtr Constructor (string aString);
[Export ("initImageCell:")]
IntPtr Constructor (NSImage image);
[Export ("target")]
NSObject Target { get; set; }
[Export ("action")]
Selector Action { get; set; }
[Export ("tag")]
int Tag { get; set; }
}

由于生成 Objective-C API 有大量重复工作,MonoMac 还提供了一个头文件解析工具,可以从 Objective-C 的头文件中生成绝大部分的 API。不过对于某些生成的结果还需要进行一些修改才能满足设计的要求,例如,NSArray 的参数和返回值需要根据文档修改为合适的强类型。

MonoMac 还没有覆盖完整的 Cocoa API,不过已经基本可以用于创建 API,并已经开放接纳社区的贡献。目前的绑定有:

  • AddressBook(完成)
  • AudioToolbox(完成)
  • AppKit(90% 完成)
  • CoreAnimation(完成)
  • CoreFoundation(已完成设计原则中需要的部分)
  • CoreText(完成)
  • CoreLocation(完成)
  • CoreData(完成)
  • CoreGraphics(完成)
  • Foundation(已完成设计原则中需要的部分,包括其他部分的辅助工具)
  • WebKit(缺少 DOM 代码)

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 共用的代码。如果您对 OS X 下的.NET 开发及 MonoMac 感兴趣,可以参考这篇开发向导

另一方面,最近 Logos Bible Software 的技术领导人 David Mitchell在 Mono 邮件列表上表示,他们基于 Mono,将原本为 Windows 平台开发的软件移植到了 Mac 平台上,两者共享了绝大部分代码,唯一不同的只是 UI 方面从 WPF 变成了 OS X 的原生界面。不过与 MonoMac 的做法不同,Logos Bible Software 的做法是在 Objective-C 编写的 UI 界面中调用.NET 代码。

2010-10-26 23:262285
用户头像

发布了 157 篇内容, 共 52.6 次阅读, 收获喜欢 6 次。

关注

评论

发布
暂无评论
发现更多内容

Docker 安装 Nginx 部署前端项目

宁在春

nginx Docker Vue 7月月更

Prometheus 2.37.0 新特性

耳东@Erdong

release Prometheus 7月月更

STM32+ESP8266+MQTT协议连接OneNet物联网平台

DS小龙哥

7月月更

用 React 结合 SAP UI5 Web Components 来开发 SAP Fiori 应用

Jerry Wang

JavaScript 前端开发 SAP SAP UI5 7月月更

SeekTiger的Okaleido有大动作,生态通证STI会借此爆发?

EOSdreamer111

Python干货篇——列表及列表常用内置函数

Java学术趴

7月日更

Qt | 模态对话框和非模态对话框 QDialog

YOLO.

qt 7月月更

超干货!彻底搞懂单工、半双工、全双工的区别与联系

wljslmz

网络技术 7月月更 通信模式 双工

【愚公系列】2022年07月 Java教学课程 06-常量

愚公搬代码

7月月更

【函数式编程实战】(二)代码的行为参数化传递

小明Java问道之路

函数式接口 Lambda 函数式编程 行为参数化 7月日更

从源码上学习 MockMvc 的使用

安逸的咸鱼

Java 源码 Mock测试框架 7月月更

云原生(十) | Kubernetes篇之Kubernetes简介

Lansonli

云原生 k8s 7月月更

Android 开发遇到的Exception

沃德

android 7月月更

strncpy() 复制字符串(受长度限制)

謓泽

7月月更

在 SAP 云平台上部署和运行 Docker 应用

Jerry Wang

Docker Kubernetes 云原生 SAP 7月月更

Elephant Swap的LaaS方案迅速崛起,构建全新DeFi2.0协议

EOSdreamer111

QT exe只允许运行单个

小肉球

qt 7月月更

另类加法与走方格的方案数

未见花闻

7月月更

数据结构-顺序表的实现

芒果酱

数据结构 C语言 7月月更

Elephant Swap的LaaS方案迅速崛起,构建全新DeFi2.0协议

鳄鱼视界

Qt|编辑框的使用总结

中国好公民st

qt 7月月更

mysql进阶(十七)Cannot Connect to Database Server问题分析

No Silver Bullet

MySQL 数据库 7月月更

React函数组件详解

恒山其若陋兮

7月月更

Elephant Swap的LaaS方案优势分析,致eToken表现强势

股市老人

深浅拷贝

Jason199

js 深拷贝 浅拷贝 7月月更

谈谈程序员如何提高自己的写作能力

宇宙之一粟

写作 7月月更

SeekTiger的Okaleido有大动作,生态通证STI会借此爆发?

股市老人

zookeeper-运行期间的leader选举与observer

zarmnosaj

7月月更

C#入门系列(二十七) -- LINQ简析

陈言必行

7月月更

机器学习-集成学习

AIWeker

机器学习 7月月更

[ kitex 源码解读 ] Kitex 扩展性设计思路

baiyutang

Go golang 云原生 微服务框架 kitex

Mono向Mac OS应用程序开发示好_.NET_赵劼_InfoQ精选文章