65.9K
CodeProject 正在变化。 阅读更多。
Home

Mono 入门 - 您的第一个 Mono 应用

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.84/5 (133投票s)

2005年1月25日

26分钟阅读

viewsIcon

1377113

关于 Mono 系列文章的第一篇。本文解释了如何安装 Mono 并展示了如何编译您的第一个跨平台应用程序。

引言

不久前,CodeProject 的各位宣布了一个新的跨平台 .NET 专区。当时我完全在使用 C# 和 .NET 平台开发基于 Windows 的应用程序,所以尽管在其他平台上使用 C# 应用程序很有趣,但这不是我当时有时间做的事情。然而,命运再次介入,这次是以一个新项目的形式,很快我将会在无疑需要一些跨平台功能的系统上工作。由于大部分开发仍然针对 Windows 平台,技术栈将保持不变,并且开发 .NET 应用程序时的幸福感将依然存在。

总之,我突然意识到我对使用 .NET 进行跨平台开发知之甚少。当然,我听说过 Mono、Rotor 和 Platform.NET,并且在这里和那里读过一些文章,但我对使用这些都没有任何实践经验。经过一番研究,我决定 Mono 是即将到来的项目最有前途的选择,我决定试一试。我对 Linux 相当熟悉,并且在大学时使用 C、C++ 和 Java 为 Linux 开发过应用程序,尽管是基本的。然而,许多来自困惑的 Windows 开发人员的博客文章,他们曾尝试在 Linux 上启动并运行 Mono,这让我开始前有些担心。令我惊讶的是,这实际上是一次轻松的经历,在 Linux 上运行 Mono 很容易。在 Windows 上设置和运行它甚至更容易。

Mono 到底是什么?

当微软向世界发布 .NET 时,他们很友善地将公共语言基础结构 (CLI) 和 C# 语言交给了欧洲计算机制造商协会(大多数人更熟悉 ECMA)的人们。这使得 CLI 和 C# 的 ECMA 标准得以开发,最终,这些 ECMA 标准也成为了 ISO 标准。在这个阶段,你可能在想“那么,这和 Mono 是什么有什么关系?”放松,慢下来,我快说到了。这种标准化意味着 CLI 实现应该如何工作的细节,以及 C# 编程语言的细节,都是公开可用的,任何有时间和愿望的人都可以实现他们自己的 CLI,实质上是创建他们自己的 .NET 版本。Mono 就此诞生。

Mono 是一个“基于 .NET 框架的开源开发平台,它允许开发人员以前所未有的生产力构建 Linux 和跨平台应用程序”。在撰写本文时,Mono 的最新稳定版本是 1.0.5,它提供了以下功能:

  • 兼容 ECMA 标准的公共语言运行时 (CLR)
  • C# 编译器
  • 一组类库
  • 辅助工具,如反汇编器、调试器、IDE 等。

尽管对许多人来说这听起来可能不多,但 Mono 项目背后的人们所取得的成就令人印象深刻。Mono 提供的类库包括 ADO.NET、ASP.NET 和 System.Windows.Forms 的实现,以及 .NET 开发人员熟悉的 BCL 的许多其他方面。除此之外,还有 Gtk# 库,这是一个功能齐全的库,允许在 gtk+ 工具包之上开发 GUI 应用程序。总而言之,相当令人印象深刻。

使用 Mono,您可以在 Linux、Windows 和其他平台上开发和运行 .NET 应用程序。您可以在 Linux 服务器上构建和部署 ASP.NET 应用程序。您甚至可以在 Mono 运行时上运行使用 Microsoft C# 编译器编译的应用程序,反之亦然。

本文的目的是什么?

本文是我将撰写的一系列关于使用 Mono 开发跨平台应用程序的文章的第一篇。其目的是解释如何在 Linux 和 Windows 上启动并运行 Mono。我将解释如何安装 Mono,然后我将向您展示如何使用 C# 编译器编译和运行您的第一个跨平台 .NET 应用程序。我还会列出 Mono 附带的一些辅助工具。最后,我将展示如何在 Microsoft .NET Runtime 上运行使用 Mono 创建的应用程序,反之亦然。

很遗憾,我还没有机会在 Mac 上使用 Mono,所以本文不会涉及它。但是我会在未来的文章中尝试涵盖它以及 Platform.NET。不过不作保证。

你需要知道什么

本文不会向您展示如何使用 C# 编程。这是您需要自己学习的东西。CodeProject 上有很多优秀的入门文章,您可以阅读以对该语言的来龙去脉有一个扎实的理解。

理解 .NET Framework 及其作用并非必需,但肯定会有益。

让我们开始吧

在使用 Mono 开发任何东西之前,您首先需要将其安装并运行在您所需的平台上。由于本文属于跨平台 .NET 部分,而 Mono 的主要用途之一是开发和使用跨平台应用程序,因此我将涵盖在 Windows 和 Linux 上安装 Mono。我将首先介绍在 Windows 上的安装,尽管说实话,这有点不费吹灰之力。正如我上面提到的,在撰写本文时 Mono 的最新稳定版本是 1.0.5,我将使用此版本。最新 Mono 发布的下载页面是 http://www.mono-project.com/downloads/index.html[^],但我将在每个部分提供我下载的文件的直接链接。

如果您不想在 Windows 上安装 Mono,可以直接跳转到下面的 在 Linux 上安装 Mono 部分。

在 Windows 上安装 Mono

Mono 的 Windows 版本运行于 Windows 2000 及更高版本。我使用的是安装了 Service Pack 2 的 Windows XP Professional。这可能没有什么区别,但我只是想提及一下,以防我关于在 Windows 上安装 Mono 的说明与您自己的设置所需的步骤略有不同。只需遵循这些步骤,您应该很快就能运行:

  1. 从 Mono 下载页面下载 Mono Windows 安装程序。我正在使用的文件是 http://www.go-mono.com/archive/1.0.5/windows/mono-1.0.5-gtksharp-1.0.5-win32-0.1.exe
  2. 安装程序是标准的 Windows 安装程序,因此下载后,您只需双击即可运行它。
  3. 安装程序启动后,单击“下一步”进入“许可协议”页面。
  4. 您可能会在“许可协议”页面上注意到,安装的不同组件适用多种不同的许可。虽然我理解大多数人只是同意并点击“下一步”,但如果我不建议您在同意之前阅读“许可协议”,那将是不负责任的。
  5. 通过许可协议部分后,会显示有关安装的一些一般信息。我上面链接的安装程序提到它包含 Gtk# 和 XSP(一个基于 Mono 的 Web 服务器,我将在本系列的下一篇文章中介绍)以及其他内容。
  6. 单击“下一步”并选择安装位置。
  7. 再次单击“下一步”进入“选择组件”页面。您可以自由自定义您的安装,但由于我将在本系列的其他文章中使用此安装的所有组件,因此我建议您接受默认的“完整安装”。
  8. 再次单击“下一步”,您可以自定义显示在“开始”菜单中的 Mono 文件夹的名称。
  9. 如果您决定进行完整安装或已安装 XSP,安装程序现在会询问您希望 Web 服务器监听哪个端口。通常这将是端口 8088,但您可以将其更改为系统上任何空闲端口。准备好后,单击“下一步”。
  10. 最后,单击“安装”以在您的 Windows 机器上安装和配置 Mono。

上面列出的说明可能过于冗长。大多数人只需一路点击“下一步”就可以了。然而,我通常在安装东西时会花些时间。你永远不知道人们会在安装程序中塞入什么,而且知道你机器上到底安装了什么总是好的。

在此阶段,您可以继续阅读并学习如何在 Linux 机器上安装 Mono,或者如果您没有 Linux 安装,或者暂时只想在 Windows 上开发,您可以跳到 您的 Mono 工具集 部分。

在 Linux 上安装 Mono

Linux 是一个很棒的操作系统。这一点毋庸置疑。然而,Linux 平台存在一些基本问题,这些问题源于内核和大多数支持软件都是开源的这一事实。问题很简单;有太多不同的 Linux 发行版,以至于没有单一的软件安装方法。你为什么要关心这个?好吧,取决于你使用的发行版,在安装 Mono 时,这可能会让你的生活变得比它需要的更复杂。你会在下面看到我的意思。

为了让 Mono 启动并运行,我决定选择一个更流行的 Linux 发行版。部分原因是我熟悉它,部分原因是在公司内部的 FTP 服务器上已经有一个安装 DVD 的 iso。如果我这里有一个完美的发行版,就没有必要下载一个不同的发行版。那么,我选择了什么?SuSE 9.2 Professional。我使用 Microsoft Virtual PC 2004 创建了两个相同的虚拟 PC。两个是因为我想尝试两种不同的、互不排斥的安装和配置 Mono 的方法。我不想让它们相互干扰,所以我决定使用两个独立的虚拟 PC。我在虚拟 PC 中挂载了安装 DVD iso,然后在这两个虚拟 PC 上安装了一个相同的系统。我选择禁用 ACPI(这是您可以选择的第一个选项之一),并且我选择了默认的软件包选择。没有什么花哨的。只是 SuSE 9.2 Professional 建议的基本默认系统。

如果您有不同的 Linux 发行版(请查看 http://www.distrowatch.com/ 以获取可用发行版的良好列表),那么下面的安装说明对您来说可能会略有不同。

简单的方法

顾名思义,这种方法,嗯,很简单。然而,这种方法的缺点是它不能在所有 Linux 发行版上运行。如果您查看 Mono 下载页面 (http://www.mono-project.com/downloads/index.html[^]),您会看到有一些软件包适用于一些更常见的 Linux 发行版,包括 Red Hat、SuSE、Fedora 和 Novell Linux Desktop。现在许多 Linux 发行版将与其中一些安装包兼容,但具体哪些兼容哪些不兼容超出了本文的介绍范围。不幸的是,如果您不使用列出的发行版之一,您要么需要从您的发行版文档中找出哪些软件包兼容,要么您可以下载 Mono 源代码并从中构建 Mono(在下面的 不适合胆小者 部分介绍)。如果您不熟悉 Linux,我建议您尽力避免后一种选择,因为它可能会变得很麻烦。

所以,你有一个 Mono 下载页面似乎喜欢的 Linux 发行版。太棒了。你很幸运,因为这将是轻松的。

  1. 在 Mono 下载页面上,点击您认为与您的发行版兼容的 Linux 发行版旁边的“软件包”链接。我只是简单地选择了 SuSE 9.2 旁边的链接。
  2. 这应该会带您到一个页面,其中列出了许多已为该特定 Linux 发行版编译和打包的不同软件包。
  3. 目前我们只对左上角的“Mono Core Runtime and C# compiler”部分感兴趣。
  4. 在此部分,您需要单击 Mono Core 的下载链接。确切名称会因您选择的软件包链接而异,但通常会以“mono-core-1.0.5”开头。我使用了 http://www.go-mono.com/archive/1.0.5/suse-92-i586/mono-core-1.0.5-1.ximian.10.4.i586.rpm
  5. 下载此文件并记住您保存的位置!
  6. 下载完成后,只需打开文件,它将启动您特定发行版的包管理器。
  7. 从此时起,您必须遵循您的包管理器特定的安装程序,但通常只有一个“安装包”按钮。点击它!
  8. 一段时间后,Mono 核心应该会安装完毕。恭喜!

如果您好奇、无聊,或者上述说明不适用于您的发行版,那么下一节将介绍如何从源代码构建和安装。一般来说,这应该是一个轻松的过程,但正如您将看到的,对于我决定使用的默认 SuSE 9.2 Professional 安装来说,它变得不那么轻松了。

当您进入软件包页面时,您可能注意到了 Gtk#、XSP 和其他一些 Windows 安装程序默认安装的下载内容。目前您可以忽略这些。在未来的文章中,我需要您安装这些软件包,但如果需要,我将逐步介绍安装过程。

不适合胆小者

如果您在此阶段已在 Linux 发行版上安装了 Mono,那么您可以跳到 您的 Mono 工具集 部分。当然,除非您有兴趣了解我是如何花费两个小时编译源代码的。

好的。所以你想从源代码编译 Mono,然后安装它。没问题。这“应该”是一个简单的过程。我已经在 Linux 上多次配置、编译和安装源代码应用程序,没有任何问题。但这次不同。在本节中,我将向您解释从源代码“应该”如何工作。然后我将向您展示当我从 Mono 源代码配置、编译和安装时,它对我来说是如何工作的。开始吧。

  1. 您需要做的第一件事是下载源代码。再次,前往 Mono 下载页面 http://www.mono-project.com/downloads/index.html[^]。
  2. 在源代码部分,点击并下载 Mono Runtime 源代码(通常在最顶部)。我下载并使用的文件是 http://www.go-mono.com/archive/1.0.5/mono-1.0.5.tar.gz
  3. 文件下载完成后,在控制台进行剩余操作。
  4. 我建议以具有 root 权限的用户身份执行剩余过程。如果您刚将 Linux 安装为独立机器,通常可以通过键入 `sudo bash` 命令并输入 root 密码来为您的帐户授予 root 权限。
  5. 您可以使用命令 `tar -xvzf mono-1.0.5.tar.gz` 解压下载的文件,其中 mono-1.0.5.tar.gz 是您下载的文件名。
  6. 接下来,通过输入 `cd mono-1.0.5` 或 `cd` 后跟您解压文件的目录名(如果与我的不同)切换到源代码解压到的目录。
  7. 现在,在编译源代码之前,您需要配置 make 文件。为此,只需键入 `./configure --prefix=/usr`。这会花一些时间。我在这里假设没有错误,并且 `./configure --prefix=/usr` 顺利进行。正如您将从我下面概述的经验中看到的那样,默认的 SuSE 9.2 Professional 安装并非如此。
  8. 当 `./configure --prefix=/usr` 完成后,您可以继续编译和安装源代码。
  9. 要实际编译 Mono Runtime 源代码,您需要运行 `make` 命令。
  10. 最后,为了安装,如果找不到更好的词,只需运行 `make install` 命令。这会将编译好的二进制文件、库和其他零碎文件部署到正确的目录。

现在,这就是事情应该如何运作的。而且,如果我安装的是带有开发工具的 SuSE 9.2 Professional 版本,那么就会发生这种情况。然而,正如我之前提到的,我选择了默认安装。我想看看对于一个来自 Windows 的人来说,习惯于最少配置的操作系统安装,情况会是怎样的。

以下,相当长的一系列步骤,是我为配置、编译和安装 Mono 运行时源代码所必须做的事情。它并不是一个复杂的过程。实际上一切都相当简单。只是对于一个几乎没有 Linux 经验的人来说,看到他们的初始 `./configure --prefix=/usr` 失败可能会相当令人生畏,而所有 Mono 安装文档都告诉他们只需输入三个命令:`./configure --prefix=/usr`,然后是 `make`,最后是 `make install`。我曾犹豫是否应该添加我使用 Mono 源代码的经验,因为它相当冗长,而且可能不会给文章增添任何内容。然而,既然我遇到了这些问题,我确信其他人也会遇到,希望我的经验能在您遇到类似问题时帮助您。如果您已经安装了 Mono,请随时跳过本节的其余部分。

所以。这就是我所做的,一切都只为了你!

  • http://www.go-mono.com/archive/1.0.5/mono-1.0.5.tar.gz 下载“Mono Runtime 1.0.5”。
  • 解压下载的文件,然后进入源代码目录。
  • 运行 `sudo bash` 命令以获得 root 权限。
  • 为 Mono 运行 `./configure --prefix=/usr`。
    • `./configure --prefix=/usr` 失败,因为默认的 SuSE 安装没有安装所需的编译器。
    • 使用 Yast 安装编译器(gcc c++ 及其依赖项)。
  • 再次为 Mono 运行 `./configure --prefix=/usr`。
    • `./configure` 失败,因为默认安装没有安装 bison。
    • http://ftp.gnu.org/gnu/bison/bison-2.0.tar.gz 下载 bison。
    • 解压 bison 下载并进入解压后的目录。
    • 为 bison 运行 `./configure`。
      • bison 的 `./configure` 失败,因为需要 GNU m4 版本 1.4(或更高版本)。
      • http://ftp.gnu.org/gnu/m4/m4-1.4.1.tar.gz 下载 m4。
      • 解压 m4 下载并进入解压后的目录。
      • 为 m4 运行 `./configure`... 成功!
      • 为 m4 运行 `make`... 成功!
      • 为 m4 运行 `make install`... 成功!
    • 再次为 bison 运行 `./configure`... 成功!
    • 为 bison 运行 `make`... 成功!
    • 为 bison 运行 `make install`... 成功!
  • 第三次为 Mono 运行 `./configure --prefix=/usr`。
    • `./configure` 再次失败,因为需要“pkg-config”,而默认的 SuSE 9.2 安装没有安装它。
    • http://www.freedesktop.org/software/pkgconfig/releases/pkgconfig-0.15.0.tar.gz 下载 pkg-config。
    • 解压 pkg-config 下载并进入解压后的目录。
    • 为 pkg-config 运行 `./configure`... 成功!
    • 为 pkg-config 运行 `make`... 成功!
    • 为 pkg-config 运行 `make install`... 成功!
  • 第四次为 Mono 运行 `./configure --prefix=/usr`!
    • 你猜怎么着?... 是的... `./configure` 又失败了。这次是因为需要 glib-2.0(或更高版本),而默认的 SuSE 9.2 安装没有安装它。
    • ftp://ftp.gtk.org/pub/gtk/v2.6/glib-2.6.1.tar.gz 下载 glib-2.6.1。
    • 解压 glib-2.6.1 下载并进入解压后的目录。
    • 为 glib-2.6.1 运行 `./configure`。
      • glib-2.6.1 的 `./configure` 失败,因为系统安装的 C 库中没有“gettext”支持。
      • ftp://ftp.heanet.ie/mirrors/ftp.gnu.org/gnu/gnu/gettext/gettext-0.14.tar.gz 下载 gettext 0.14。
      • 解压 gettext 0.14 下载并进入解压后的目录。
      • 为 gettext 运行 `./configure`... 成功!
      • 为 gettext 运行 `make`...
        • gettext 的 `make` 失败,因为没有安装 C# 编译器!:wtf: :confused:... `make` 建议安装 Platform.NET :rolleyes
        • 重新配置 gettext,因为我不可能为了安装 Mono 而安装 Platform.NET。
        • 为 gettext 运行 `./configure --disable-csharp`... 成功!
      • 再次为 gettext 运行 `make`... 成功!
      • 为 gettext 运行 `make install`... 成功!
    • 再次为 glib-2.6.1 运行 `./configure`... 成功!
    • 为 glib-2.6.1 运行 `make`... 成功!
    • 为 glib-2.6.1 运行 `make install`... 成功!
  • 第五次为 Mono 运行 `./configure --prefix=/usr`... 成功!终于!
  • 为 Mono 运行 `make`... 成功!
  • 为 Mono 运行 `make install`... 成功!
  • 好好休息了一下。

我不得不经历的上述编译源代码的步骤对某些人来说可能显得有些艰巨,但说实话,这实际上是一个相当简单的过程。主要问题是花费的时间。例如,Mono 的 `./configure` 每次可能需要 2 或 3 分钟。其他需要编译和安装的项的每个 `./configure` 也有类似的时间,并且一般来说,`make` 命令比其附带的 `./configure` 花费的时间更长。此外,还要花时间查找、下载和解压需要安装的不同项的源文件。哦,而且我必须重启 SuSE 才能使用安装的工具。

您的 Mono 工具集

在这个阶段,您要么放弃了,要么准备长期坚持下去。当然,也没剩下多少事了。我们已经安装了 Mono,编译和运行 C# 应用程序所需的工具也准备就绪。在我们实际编写和编译应用程序之前,我认为快速概述一下您此时应该可以使用的一些工具是个好主意。我不会详细介绍这些工具,因为在本文以及本系列的其余文章中,我将根据需要解释这些工具的详细信息。

工具 描述
disco Mono 的 Web 服务发现工具
一个用于发现 Web 服务并检索描述这些服务文档的工具。
gacutil 全局程序集缓存管理实用程序
开发人员用于将程序集安装到系统全局程序集缓存 (GAC) 的工具,使其成为运行时所有应用程序可用的程序集的一部分。
ilasm Mono IL 汇编器
Mono IL 汇编器。与 Microsoft 的 ilasm.exe 工具相当。
mcs Mono 编译器套件。
Mono C# 编译器,ECMA-334 语言规范的实现。该编译器接受与 Microsoft C# 编译器 (csc.exe) 相同的命令行选项。
mint Mono 解释器
一个 Mono 解释器,允许在不使用 JIT 的情况下执行应用程序。指令被直接解释为 x86 指令。
mono Mono 的 ECMA-CLI 本机代码生成器(即时和提前编译)
ECMA 公共语言基础结构的运行时实现。可用于运行 ECMA 和 .NET 应用程序。
monodis Mono 程序集反汇编器
一个可以将应用程序反汇编成 IL 的工具。提供与 Microsoft 的 ildasm.exe 类似的功能。
monograph Mono 程序集信息工具
一个允许您从程序集创建调用图或类型层次结构信息的工具。
monop Mono 类纲要查看器
一个允许您查看类纲要的工具。您可以查看类的每个成员的签名。
sn 对 CLR 程序集进行数字签名/验证/比较强名称
使用强名称对 CLR 程序集进行数字签名、验证或比较。
soapsuds Mono 的远程处理代理生成器
一个用于为远程处理服务生成 WSDL 文档和客户端代理的工具。
wsdl Mono 的 Web 服务代理生成器
一个用于生成可用于访问 Web 服务的代理类的工具。
xsd Mono 的用于生成架构或类文件的实用程序
一个旨在补充 Mono 的 XML 序列化支持的工具。

请记住,这只是可用工具的一个子集。如果您对具体有哪些工具感兴趣,可以查看 Mono 主页。

另外,在 Windows 上使用 Mono 时,最好将 *<Mono_Install_Dir>\bin\* 和 *<Mono_Install_Dir>\lib\* 目录添加到您的路径中(在我的系统上是 *C:\Program Files\Mono-1.0.5\bin\* 和 *C:\Program Files\Mono-1.0.5\lib\*)。这将允许您直接从命令行使用上述工具,无论您当前在哪个目录中工作。

让我们开始编码!

是时候了!到这一步应该没花你多长时间,当然,除非你最终从源代码安装了 Linux 上的 Mono 并遇到了我遇到的麻烦。所以,让我们开始吧。

你好世界!

众所周知的“Hello World!”。你无疑在过去多次见过 C# 或其他语言的 hello world 应用程序,现在你又要再看一次了。这是一种传统,我又何必违背传统呢?

无论如何,启动你最喜欢的文本编辑器,无论是在 Windows 上的记事本还是 Linux 上的 joe。输入以下代码,或者更简单,从文章中复制并粘贴。

using System;

namespace Dela.Mono.Examples
{
   public class HelloWorld
   {
      public static void Main(string[] args)
      {
         Console.WriteLine("Hello World");
      }
   } 
}

将其保存为 `HelloWorld.cs`,准备好见证 Mono 的奇迹。要编译此应用程序,只需转到命令行并键入 `mcs HelloWorld.cs`,然后按 Enter 键。请注意,上一个命令假设您的命令提示符在与 `HelloWorld.cs` 文件相同的目录中工作,并且如果您使用 Windows,Mono 目录已添加到您的路径中。如果一切顺利,您应该会看到“Compilation succeeded”文本。恭喜。您刚刚在 Mono 上编译了您的第一个 C# 应用程序。

要使用 Mono 执行应用程序,只需键入 `mono HelloWorld.exe` 并按 Enter。您将看到“Hello World”文本。您在这里所做的是加载了 Mono JIT Runtime,它 JIT 编译了 `HelloWorld.exe` 程序集中的 IL 代码并执行了指令。您也可以通过运行 `mint HelloWorld.exe` 来执行应用程序。这将使用 Mono 解释器将应用程序的所有 IL 直接转换为 x86 指令,然后再执行。这类似于在 .NET 中使用 `ngen.exe` 应用程序。

如果您在 Windows 上运行 Mono,您可能已经注意到您也可以通过简单地双击应用程序来执行它。您可能不认为这有什么特别之处,但您所做的是使用 Mono C# 编译器创建应用程序,并在 Microsoft .NET Runtime 上执行它。有关这方面的更多信息,请参阅下面的 .NET 和 Mono 互操作性 部分。

稍微复杂一点的东西

“Hello World”是传统的第一个程序,但说实话,它并没有做太多。下一个示例有点刻意,但它展示了 Mono 的更多功能,包括 `System.Net`、`System.Text` 和 `System.Text.RegularExpressions` 命名空间。我也知道代码都堆积在 `Main` 方法中,应该进行重构,但正如我所说,这只是一个刻意为之的示例,而不是代码风格的课程。

该示例只是获取您想要在 http://www.google.com/ 上搜索的字符串,然后显示返回的前五个结果。没什么大不了的,但它确实展示了一个比上面的 Hello World 示例稍微复杂一点的示例。无论如何,再次启动您最喜欢的文本编辑器,输入以下代码,或者从文章中复制并粘贴。

using System;
using System.Net;
using System.Web;
using System.Text;
using System.Text.RegularExpressions;

namespace Dela.Mono.Examples
{
   class GoogleSearch
   {
      static void Main(string[] args)
      {
         Console.Write("Please enter string to search google for: ");
         string searchString = HttpUtility.UrlEncode(Console.ReadLine());
         
         Console.WriteLine();
         Console.Write("Please wait...\r");

         // Query google.
         WebClient webClient = new WebClient();
         byte[] response =
              webClient.DownloadData("http://www.google.com/search?&num=5&q="
              + searchString);

         // Check response for results
         string regex = "g><a\\shref=\"?(?<URL>[^\">]*)[^>]*>(?<Name>[^<]*)";
         MatchCollection matches
                  = Regex.Matches(Encoding.ASCII.GetString(response), regex);

         // Output results
         Console.WriteLine("===== Results =====");
         if(matches.Count > 0)
         {
            foreach(Match match in matches)
            {
               Console.WriteLine(HttpUtility.HtmlDecode(
                  match.Groups["Name"].Value) + 
                  " - " + match.Groups["URL"].Value);
            }
         }
         else
         {
            Console.WriteLine("0 results found");
         }
      }
   }
}

将此文件保存为 `GoogleExample.cs` 并返回命令行。编译此应用程序的命令与我们用于 Hello World 示例的命令略有不同。此应用程序使用了 `HttpUtility` 类,该类在 `System.Web.dll` 程序集中定义。这意味着我们编译时需要引用此程序集。为此,您只需使用 `-r` 开关。这是您编译此应用程序所需的完整命令:`mcs GoogleExample.cs -r System.Web.dll`
再次,上一个命令假设您的命令提示符在与 GoogleExample.cs 文件相同的目录中工作,并且如果您使用 Windows,Mono 目录已添加到您的路径中。

与 Hello World 示例一样,您可以从命令行使用 `mono GoogleExample.exe` 或 `mint GoogleExample.exe` 运行此应用程序——任君选择。相同的编译程序集将在 Windows 和 Linux 上运行。您可以通过在 Windows 上编译它,将程序集复制到 Linux 机器并在那里运行 `mono GoogleExample.exe` 命令来测试这一点。

.NET 和 Mono 互操作性

我在上面的 Hello World 示例中提到过,您可以简单地将 Mono 编译器创建的程序集(在该示例中是 `HelloWorld.exe`)在安装了 .NET 的 Windows 环境中双击,它就会执行。这到底是如何工作的呢?其实很简单。Mono C# 编译器和 Microsoft C# 编译器都将代码编译成一种称为 IL 的中间形式。当您执行一个程序集时,运行时会解释并执行 IL 代码。因此,您可以将从 VB.NET 代码或任何 .NET 语言编译的程序集在 Mono 上运行,反之亦然。然而,这里有一个小问题:Mono 没有完全实现 .NET 类库,因此您的所有应用程序都不能使用 Mono 运行。现在不必太担心,因为在本系列接下来的几篇文章中,我们将了解哪些可以运行,哪些不能运行,并希望能探讨其原因。

下一步?

希望本文已向您展示如何在 Windows 和 Linux 上安装 Mono 并启动您的第一个 Mono 应用程序。不过这还远远不够。您显然想做更多的事情,而不仅仅是创建简单的控制台应用程序。正如我在本文中一直强调的,这只是我将撰写的一系列关于 Mono 和使用 Mono 进行跨平台 .NET 开发文章的第一篇。那么,下一篇文章的计划是什么?嗯,我知道最好是立即开始创建跨平台 GUI 应用程序,但在我们看这个之前,我想先介绍一下使用 Mono 进行 Web 应用程序和 ASP.NET 开发,这将是下一篇文章的主题;编写您的第一个可以在 Linux 和 Windows 上运行的 ASP.NET 应用程序。

链接

历史

2005年6月8日 - 更正了 Mono 工具“mint”的详细信息。

2005年3月1日 - 更新了一些语言错误,并将从 Linux 源代码安装 Mono 时更改为安装到 `/usr` 目录。

2005年1月25日 - 首次发布。

© . All rights reserved.