Mono 把 .NET 应用程序移植到 Linux

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%。

平台

解释器

即时编译器(更快)

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

/* Platform Invocation Facility Example This code is intended to illustrate P/Invoke. For out purposes we will access a c shared library. */ using System; // This is a lot of the magic! using System.Runtime.InteropServices; /* Class illustrates pinvoking existing c library code */ public class PInvokeExample { /* Notifying the runtime that we need an additional mathematics library, libm.so */ [DllImport("libm")] /* Here we define the external function we will be using from the library, You must declare these methods to be static. The function signature you provide must match the signature in the external library! */ static extern double sqrt ( double element ); public static void Main () { Console.WriteLine("The square root of 100.0 is {0}.", sqrt(100.0)); } }

从上述简化的代码中可以看出,只需要告诉 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

参考资料

学习

获得产品和技术

讨论

关于作者

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏jessetalks

从Membership 到 .NET4.5 之 ASP.NET Identity

我们前面已经讨论过了如何在一个网站中集成最基本的Membership功能,然后深入学习了Membership的架构设计。正所谓从实践从来,到实践从去,在我们把...

3356
来自专栏黑泽君的专栏

Notepad2替代系统自带的记事本

事情是这样的,平时我经常把一些文字复制到记事本中编辑好了再复制到目标位置,可以在系统自带的记事本中替换删除一些内容,记事本小巧,占用很少的资源,我很喜欢;但今天...

4242
来自专栏葡萄城控件技术团队

如何在 ASP.NET MVC 中集成 AngularJS(3)

今天来为大家介绍如何在 ASP.NET MVC 中集成 AngularJS 的最后一部分内容。 调试路由表 - HTML 缓存清除 就在我以为示例应用程序完成之...

22110
来自专栏角落的白板报

【公开课】ABP CORE 框架入门视频教程《电话薄》基于 Asp.NET Core2.0 EF Core

ABP框架简介 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称。 ASP.NET Boilerplate是...

4884
来自专栏FreeBuf

我有两把枪:Powershell + HTA

我去前面探探路 众所周知,Powershell早已被集成到了windows的环境中,国外大牛玩得不亦乐乎,而国内圈子却很少听到讨论Powershell的,至少...

3128
来自专栏黑泽君的专栏

Notepad2替代系统自带的记事本Notepad

原博文链接:https://www.cnblogs.com/best/p/5819858.html

2632
来自专栏张善友的专栏

ASP.NET Web API对OData的支持

在SOA的世界中,最重要的一个概念就是契约(contract)。在云计算的世界中,有关通信的最重要的概念也是契约。XML具有强大对数据的描述能力,Atom格式和...

2405
来自专栏cnblogs

directshow、 Emgucv入门

本示例主要测试了directshow、Emgucv的视频流采集功能,其中Emgucv还实现了人脸的识别。示例源码下载 一、directshow的介绍 实现原理:...

2809
来自专栏张善友的专栏

跨平台的 .NET 运行环境 Mono 3.2 新特性

Mono 3.2 发布了,对 Mono 3.0 和 2.10 版本的支持不再继续,而且这两个分支也不再提供 bug 修复更新。 Mono 3.2 主要新特性: ...

1978
来自专栏张善友的专栏

Visual Studio LightSwitch

LightSwitch是一个基于模板的自动化开发Silverlight和HTML5应用程序的工具,不同于一般的基于数据字典,配置生成的应用程序的工具,因为Lig...

2168

扫码关注云+社区

领取腾讯云代金券