Mono 是基于 .NET 的开放源码开发平台,它让您可以使用各种 .NET 兼容语言创建强大、灵活的 Linux® 应用程序,同时利用跨平台的能力。本文带领您在系统上安装 Mono,并开发第一个用 Mono 编译的可同时在 Linux 和 ® Windows® 上运行的 C# 应用程序。

C# 语言是一种面向对象的语言,用于为 Microsoft .NET 平台快速构建各种应用程序。C# 和 .NET 的目标是把您从底层的编程问题中解脱出来,如类型安全问题、内存管理、库构造等,以便把精力集中到构建应用程序和业务逻辑上。从而可以帮助缩短开发周期。

随着 C# 和 .NET 战略喧嚣尘上,有人可能在想 Linux 社区将作出什么样的反应。本文讨论开放源码世界(在 Novell 的强力支持下)如何通过实现自己的编译器和类库来欢迎这种语言。(实际上,有多种开放源码实现在进行中。)

本文讨论 Mono,这是 Novell 发起的基于 .NET 框架的开放源码开发平台。本文引导您在系统上安装 Mono,并开发第一个用 Mono 编译的、可在 Microsoft Windows 和 linux 上运行的 C# 示例应用程序。

Mono 的优点

Mono 赋予了开放源码程序员使用各种 .NET 兼容语言为 Linux 构建应用程序同时保持跨平台性的强大编程能力和灵活性。对于当前的 .NET 开发人员来说,Mono 的主要优点是提供了到 Linux 的更容易的迁移路径。 Mono 项目拥有非常开放和活跃的开发社区,为开发人员提供了运行 .NET 客户机和服务器应用程序的工具和基础设施。

使用 Mono 体系结构最大的好处可能是获得了语言无关。Mono 可以让您利用用 .NET 运行环境所支持的语言编写的任何已有代码

考虑下面这种情况,即传统的 Linux 编程通常完全用 C 来完成。如果希望使用其他语言,比如 Pyhthon,通常需要对原生 C 代码使用 Python 绑定。

创建绑定这种方法不一定是最优或者最容易的,而且有时候不存在绑定,因此,从任何支持 Mono 的语言,Mono 都允许您访问任何另一支持 Mono 的语言的已有代码。可以使用 C#、Python 甚至 Java™ 编写应用程序同时重用其他语言编写的类,而不需要绑定!(从 C# 程序通过 Platform Invocation Facility [pinvoke] 使用 C 库代码就是一个例子,稍后还将提到。)

如前所述,您的代码获得了平台独立性。这是自动进行的,因为 .NET 代码并没有编译成机器码,而是编译成中间语言(IL)。IL 在 Mono 提供的 .NET 运行时中使用,因此可以跨平台复制二进制代码。Java 开发人员非常熟悉这种思想,体现了“一次编写,到处运行”的观念。

Mono 还提供了省时、免费的 .NET 框架类库实现。这些针对各种常见设计任务(包括不那么常见的任务)而设计的库已经写好并经过测试。库包括最常用的数据结构、加密库、XML 和 Web 服务支持。

虽然 .NET 框架中可使用很多种语言,但是 C# 最为 .NET 开发人员所看重。C# 是一种高效、带有无用单元回收的语言,提供了强大的面向对象能力,可以让您迅速进入编程任务的核心。这种语言的语法对于曾经使用现代基于 C 的语言编程的任何人都非常熟悉,但是又包括使用现代脚本语言的那些人所熟悉的便利特性。

最后,Mono JIT (Just In Time) 编译器速度很快,在适当的性能水准的基础上提供了所有这些好处。

回页首

关于 Mono 的使用

Mono 项目包括以下开放源码实现:

  • C# 编译器
  • 虚拟执行系统(Virtual Execution System),包括 JIT 编译器、无用单元回收程序、装载器和线程引擎
  • .NET 类库实现
  • 可视化开发工具和调试器

Mono 项目工具可运行在不同硬件和操作系统上,包括 Linux、Windows 和 Mac OS X。

Mono 项目目前在不同程度上支持下列语言:

  • C#
  • Java
  • Boo
  • Nemerle
  • Visual Basic.NET
  • Python
  • JavaScript
  • Oberon
  • PHP
  • Object Pascal
  • 等等

注意,并非每一种都像 C# 运行时那样完整。比如,没有直接支持 Java,而是将 Java 字节码即时转换成 IL。

实现程度不同的另一个例子是,Python 实现最近似乎停止了。需要 Python 的开发人员可能想使用 Boo,这是一种更完整的脚本语言实现(虽然类似于 Python,但是是为 .NET 框架设计的)。谈到支持 Mono 的语言,需要提一下 Nemerle 是一种新的 .NET 平台混合编程语言(函数型、面向对象型和命令型)。

一些政治问题

有人可能奇怪,开放源码的倡导者为何要接受 Microsoft 产品并欢迎它。事实上,很多人最初都好奇 Microsoft 为何允许这种事情。

原因最终被证明是,Microsoft 一直遵守关于标准化 C# 和 CLI 的承诺。由于标准化和规范化,所以 Mono 团队能够为 C# 和公共语言基础设施建立自己的 ECMA 标准的开放实现。事实上,编译器和语言本身也都明确规定让他人实现。

关于 Mono 的大量纷争更多来自关于提供类库对于开放式规范是否必需的讨论。最终必然导致了关于专利权的激烈争论,以及作为攻击 Linux 的更大战略的一部分 Microsoft 是否会利用专利权攻击 Mono。最终,Mono 开发人员提供了两套独立的库。

一套是 Microsoft .NET 库的重新实现,用于和 Microsoft .NET 应用程序兼容。其中包括 ADO.NET、System.Windows.Forms 和 ASP.NET。

以已有的开放源码库和技术为基础,Mono 开发人员还从头创建了自己的一套强大的库,目的是提供同样的功能而避免专利侵权问题。比如,Mono 提供了称为 Gtk# 的窗口技术、用于 gtk+ 的一套 C# 绑定和种类齐全的 GNOME 库。这就使得应用程序开发人员能够使用 Mono 编写完全原生的 GNOME 应用程序。可以将其看作 Microsoft System.Windows.Forms 库的开发源码对照版。

Mono 运行在什么平台上?

Mono 已经成功移植到多种硬件平台上的 Linux、FreeBSD、Windows 和 Mac OS X。估计涵盖了桌面市场的 99%。

表 1. Mono 平台
平台 解释器 即时编译器(更快)
Linux/Alpha
Linux/ARM
Linux/MIPS
Linux (PPC)
Linux (S390)
Linux/SPARC
Linux (x86)
Linux/x86-64(64 位端口)
FreeBSD (x86)
HP-UX/HPPA
MacOS X
Solaris/SPARC v8
Solaris/SPARC v9 (64-bit port)
Windows 2000/XP
回页首

安装 Mono

现在来看看安装 Mono 过程中的一些差别。

Windows 平台

在 Windows 操作系统上安装 Mono,需要运行 Windows 2000 或 Windows XP。首先从 NovellForge 上 Mono Windows Integeration Project 主页下载最新版本的 Mono Win32 安装程序(请参阅本文最后的 参考资料)。下载完成后运行可执行的安装程序。

安装过程和其他产品的安装类似。首先提示您接受还是拒绝许可协议。接受之后,只需要提供安装路径和选择可选的组件。

为了学习 Mono 框架,建议使用默认安装,它为常用工具提供了启动菜单项。这些工具都被放到新的“Mono-1.1.7 for Windows”程序组中。

Linux 平台

多数情况下安装 Mono for Linux 相对容易一些(获得每种发行版的要求不在本文讨论之列)。

为 SUSE、Red Hat 和 Ubuntu 以及其他很多版本准备了现成的二进制安装包。基于源代码的发行版如 Gentoo 也很容易获得,只需要很少的工作就能运行。

回页首

测试 Mono 安装

为了测试核心编译器(mcs)和运行时(mono),应该创建一个简单的程序并编译它。可以在喜欢的任何文本编辑器中创建程序。这里采用一种快速而简陋的方法创建该文件(虽然没有任何格式化),从终端提示符中运行下列命令(都在一行中):

$ echo 'class X { static void Main () { System.Console.Write("My first
mono app worked!\n");} }' > example.cs

该命令创建一个名为 example.cs 的 C# 源文件(也可从下面的 下载 部分下载该文件 example.cs 和可执行文件 example.exe。(注意,如果使用 Linux 可直接使用 bash 提示符,如果使用 Windows 则需要从开始菜单中调用 Mono 命令提示符。)

要测试编译器创建可执行文件的能力,可输入下面的命令:

$ mcs example.cs

这样将生成名为 example.exe 的二进制文件。要运行它来测试运行时,可使用该命令:

$ mono example.exe

如果一切正常,就会在控制台中看到“My first mono app worked!”字样。

图 1. 正常运行的结果

事实上,可以将得到的可执行文件复制到其他系统上,比如运行 Windows 的系统上,无需修改就可以执行。

回页首

使用非 Mono 库的代码

使用 Mono 平台更有说服力的原因是能够使用已有的、可能不属于 C# 库的 C# 代码。下面是这样的一个例子(也可以从下面的 下载 部分下载清单 2 PInvokeExample.cs 和可执行文件 PInvokeExample.exe)。

提供这种能力的机制是 Platform Invocation Facility(缩写为 pinvoke)。

清单 2. 使用 Platform Invocation Facility


从上述简化的代码中可以看出,只需要告诉 Mono 编译器使用什么库(在 DLLImport 一行中完成)并提供要使用的函数的原型。如果在 Linux 系统上编译这个类,控制台将显示正确的结果。

图 2. 使用非 C# 库

回页首

Mono 的其他优点

Mono 的运行时还可以嵌入到应用程序中,从而简化打包和发送。此外,Mono 项目还提供集成开发环境、调试器和文档浏览器。

如果希望进一步了解 C# 和 .NET 框架,下面列出了各种 参考资料,包括各种用于简化开发过程的集成开发环境如 Eclipse 和 Monodevelop 的参考资料。
如果对使用 Mono 开发图形化的应用程序感兴趣,强烈推荐“Mono: A Developers Notebook”,这是一篇更深入的教程(参考资料)。
Novell 程序员仍然在为 Mono 增加新的功能,提供减轻开放源码开发人员工作负担的工具。我希望本文能够帮助您对 Mono 项目有足够的认识,以便在下一个 Linux 开发项目中使用它。

回页首

下载

描述 名字 大小  下载方法
Installation test source example.cs 1 KB  FTP
Installation test executable example.exe 3 KB  FTP
PInvoke sample source PInvokeExample.cs 1 KB  FTP
PInvoke sample executable PInvokeExample.exe 3 KB  FTP
关于下载方法的信息 获取 Adobe® Reader®
回页首

参考资料

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文。
  • 进一步了解 Standard ECMA-334, the C# Language Specification。
  • Got Mono 是 Mono 社区的主页。
  • Mono Documentation Library 包括关于 Mono 类库的文档。
  • 如果希望快速掌握 Java 语言,请阅读“走上开放之路: .NET 开发人员的 J2EE 基础”(2004 年 2 月),这是帮助 .NET 开发人员完成转换的系列文章的第 1 部分。
  • “安全设置运行 Java 服务的 Linux”(developerWorks,2003 年 4 月)包括 C# 和 Mono 项目的介绍。
  • “实现用于 DB2 UDB 的 .NET 托管提供程序”(developerWorks,2003 年 5 月)提供了更多关于 .NET 技术和 Mono 的信息。
  • “Monodoc Tutorial”提供了 Mono 文档开发指南。
  • “C#, the natural progression”(developerWorks,2000 年 8 月)说明了 C# 在语言系统中的地位。
  • Mono: A Developer's Notebook(O'Reilly,2004 年 7 月)是一本没有废话的、实验室风格的 Mono 1.0 指南,包括 50 个小项目。
  • Mono Kick Start(Sams,2003 年 9 月)是关于 Mono 和用 Mono 进行 .NET 兼容应用程序编程的实用入门。
  • Mono Project 语言页面提供了 Mono 兼容语言 的详细说明。
  • 在 developerWorks Linux 专区 可以找到更多 Linux 资源。

获得产品和技术

  • 从 Mono Project 下载页面 下载不同平台的 Mono 版本。
  • Eclipse for developing Mono applications 提供了将 Eclipse IDE 用于 C# 和其他 Mono 语言的信息。
  • DotGNU 为 Web 服务和 C# 程序提供了免费的软件解决方案。
  • MonoDevelop 项目将 SharpDevelop 移植到 Gtk# 以便为 C# 和 Mono 建立最完善的 UNIX 系统开发环境。
  • Gtk# 包含用于 gtk+ 工具箱和种类齐全的 GNOME 库的一组 C# 绑定。
  • Mono Windows Integration Project 开发在 Windows 上使用的 Mono 及其工具集。
  • 订购免费的 SEK for Linux,这套 DVD(两张),包括来自 DB2®、Lotus®、Rational®、Tivoli® 和 WebSphere® 的最新 IBM Linux 试用软件。
  • 使用 IBM 试用软件 构建您的下一个开发项目,该软件可直接从 developerWorks 下载。

讨论

  • 要联系 Mono 社区,请访问 Mono 社区论坛。
  • 通过参与 developerWorks blog 加入 developerWorks 社区。
回页首

关于作者

Eli Dow 是纽约 Poughkeepsie IBM Linux Test and Integration Center 的一位软件工程师。他从 clarkson 大学获得了计算机科学、心理学硕士学位和计算机科学博士学位。他的兴趣范围包括 GNOME 桌面、人机交互和 Linux 系统编程。可以通过 emdow@us.ibm.com 与 Eli 联系。

http://www-128.ibm.com/developerworks/cn/linux/l-mono/index.html

Mono 把 .NET 应用程序移植到 Linux相关推荐

  1. 怎样把电脑换linux系统软件,如何将OS/2应用程序移植到Linux操作系统 -电脑资料...

    当从 OS/2 移植到 Linux 时,关键的编程问题是什么? 在转换到 Linux 之前注意一下,提早发现陷阱, 本文是 LAN Distributed Platform(LANDP)for Lin ...

  2. 将 MFC 应用程序移植到 Linux(循序渐进使用 wxWindows 的指南)

    将 Windows 应用程序移植到 Linux 不必涉及再培训的痛苦经历.Markus Neifer 演示了如何使用 wxWindows 移植 MFC,指导读者使用 wxWindows 这一开放源码工 ...

  3. 将c程序移植到linux,各位大侠:我把原来在linux运行的c程序移植到HPUNIX上出现了错误...

    各位大侠:我把原来在linux运行的c程序移植到HPUNIX上出现了错误 (2012-04-11 00:43:47) 标签: linux c程序 杂谈 各位大侠:我把原来在linux运行的c程序移植到 ...

  4. 将 Win32 程序移植到 Linux

          对于这个问题,网上已经有很多资料给予了介绍,但是相比于这些信息,本文立足于个人的实践,将内容具体到开发环境和源代码,我觉得还是有很多值得总结和借鉴的.         首先声明开发环境.W ...

  5. python程序移植到linux,如何使python或perl脚本可移植到Linux和Windows?

    I was wondering how to make a python script portable to both linux and windows? One problem I see is ...

  6. 【转】将 Linux 应用程序移植到 64 位系统上

    原文网址:http://www.ibm.com/developerworks/cn/linux/l-port64.html 随着 64 位体系结构的普及,针对 64 位系统准备好您的 Linux® 软 ...

  7. 将vs+Qt的工程从windows平台移植到linux下_

    ​​​​​​​​​​​​将vs+Qt的工程从windows平台移植到linux下_崔杰城的博客-CSDN博客_windows下的qt工程移植到linux下 windows下Qt的开发人员常用vs+Qt ...

  8. 将vs+Qt的工程从windows平台移植到linux下

    windows下Qt的开发人员常用vs+Qt插件进行Qt桌面程序的开发.因为Qt是跨平台的,所以开发完成后如果需要把程序移植到linux下运行,只要把vs的项目工程放到linux下,编译即可.下面介绍 ...

  9. windows开发的qt项目移植到linux平台

    关键字:qt.linux.window.Qserialport  0 前言 接触这个任务之前,完全qt小白,大大小小的坑踩了不少. 1 环境与配置 qt5.12.12 ubuntu20.04 基于st ...

最新文章

  1. 二叉树(构造与遍历方法)
  2. spark on yarn提交后vcore数不对
  3. Linux 切换目录命令cd
  4. 文本怎么整体向左缩进_如何设置Word文档的左缩进或者右缩进呢?并在缩进区域输入文字...
  5. 【渝粤教育】电大中专幼儿园课程论 (1)作业 题库
  6. 织梦5.7生成HTML很慢,Dedecms 生成静态网页速度特别慢的问题
  7. 我比领导小15岁,互相有好感,为什么每次路过我办公室都叹气?
  8. js selector设计及实现(一) 实现思路
  9. C#兼容PHP的GZip算法
  10. sql server 语法 MSDN
  11. 什么是闭包?如何理解及使用闭包?
  12. [置顶] 数据结构之 链栈的实现
  13. 计算机控制液压同步顶升系统,PLC多点控制液压同步顶升系统的运用
  14. 红帽linux认证的有效期,红帽RHCE证书过期怎么办
  15. matlab高维矩阵提取其中n维
  16. 三菱Q系列PLC项目资料 本系统采用三菱Q系列PLC,本系统中用到16个伺服电机
  17. 请问现在好多抖音巨量广告落地页pages.tmall.com的页面如何生成
  18. Python:用【Win32】模块,结合Word通配符替换,将Word文档表格的部分内容替换为加粗
  19. 【GlobalMapper精品教程】004:生成标准经纬网图幅(1:100万)案例教程
  20. python字典创建、使用字典保存中国主要城市和对应邮编_Python字典及相关操作(内含例题)...

热门文章

  1. python国防_Python+Excel数据分析实战:军事体能考核成绩评定(二)基本框架和年龄计算...
  2. python history没有定义_python – AttributeError:’Tensor’对象没有属性’_keras_history’...
  3. select 统计 没有 为0_sql where 1=1和 0=1 的作用
  4. excel甘特图模板_类似这样的甘特图是怎么做的?
  5. oracle9i的全局变量,Oracle9i, 10g 如何抓取绑定变量的值
  6. 电脑课装b专用代码_FANUC伺服电机代码表(完整版)
  7. c标签判断true false jsp_巧妙使用if(true)以及if(false)语句
  8. 在CSS中如何使用 when/else
  9. linux下把进程绑定到特定cpu核上运行
  10. 【项目展示】一个有点难度的猜数字小游戏(Java编写)