Mono初探--创建你的第一个Mono应用程序 (三)

本文介绍如何在Windows和Linux上安装Mono,并使用它创建和运行C#应用程序。通过两个示例,HelloWorld和Google搜索,展示了Mono的灵活性和跨平台能力。同时,文章还探讨了Mono与.NET的互操作性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Your Mono toolset

到这里的时候你可能已经放弃了,或者跟了下来.我们剩下要做的已经不多了.我们已经安装好了Mono和一些我们准备用来编译并运行C#应用程序的工具.在我们开始编写并运行应用程序之前,我觉得最好先稍微看一下目前已经可以使用的那些工具的简介,这只是其中的一部分工具.<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

Tool

Description

disco

Mono的 Web Service Discovery 工具
一个用来寻找web services 并且检索描述这些services的文档的工具

gacutil

全局程序集缓存管理工具

这是一个开发者用来将某个程序集安装到系统的全局程序集缓存的工具.这样做的目的是将这些程序集变成对所有应用程序在运行时都可用的程序集的一部分.

ilasm

Mono IL 编译器

这是 Mono IL 代码编译器. 就和Microsoft的 ilasm.exe这个工具一样.

mcs

Mono Compiler Suite.
这是Mono的C#编译器,是一个ECMA-334语言标准的实现.这个编译器接受和 Microsoft C# 编译器(csc.exe)一样的所有的命令行参数.

mint

Mono Interpreter

这是Mono的解释程序.它允许应用程序可以不通过JIT编译器来执行.应用程序的指令直接被编译为X86的机器指令

mono

Mono的 ECMA-CLI 本地代码生成器 (Just-in-Time and Ahead-of-Time)

这是对ECMA通用语言基础的运行时的实现. ECMA和.NET的应用程序是给予它来运行的.

monodis

Mono 程序集反汇编工具

这个工具可以将应用程序反汇编为IL代码. 它的能力和Microsoft's ildasm.exe差不多.

monograph

Mono 的程序集信息工具
这个工具允许你从程序集中创建调用关系图或者是类型的层次信息.

monop

Mono 的类型查看工具
这个工具允许你查看一个类的轮廓.你可以看到每个类成员的签名.

sn

在CLR程序集上的进行数字 签名/验证/比较 的强命名工具
CLR程序集使用强命名来进行数字 签名,验证或者是比较.

soapsuds

Mono的远程代理生成器

这个是用来生成WSDL文档和远程服务的客户端代理的工具.

wsdl

Mono的 Web Service 代理生成器
这个工具是用来生成可访问 web services的代理类型.

xsd

Mono用来生成 schema  或 class 文件的工具
这个工具是为了辅助Mono对 XML 序列化的支持.

 

要记住,这仅仅那些可以用到的工具的一个子集.如果你对所有工具都感兴趣的话你应该看一下Mono的主页.还有,如果在Windows上使用Mono的话那我这里还有一个不错的想法,那就是将路径\bin\\lib\添加到你的环境变量中(在我的系统中是C:\Program Files\Mono-1.0.5\bin\ and C:\Program Files\Mono-1.0.5\lib\).这样你就可以直接从命令行调用前面提到的那些工具,而不需要去理会它当前的路径是什么.

Let's code!

是时候了!看到这里应该不会花费你太多的时间吧,除非你是在Linux上从源文件安装并运行Mono的时候遇到了我说的那些麻烦.让我们继续吧.

Hello World!

无人不知无人不晓的”Hello World!”.你过去绝对已经无数次的从C#,或者其他的一些语言中看到过了Hello World的应用程序,现在你要再看它一次了.这是一种传统,难道我可以和传统做斗争吗?

不管怎么样,请打开你喜欢的文本编辑器,也许是Windows系统中的notepad或者是Linux里的joe.然后输入下面的代码,其实更简单的方法是直接从文章中把它复制并粘贴上去.

 1 None.gif using  System;
 2 None.gif
 3 None.gif namespace  Dela.Mono.Examples
 4 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
 5InBlock.gif   public class HelloWorld
 6ExpandedSubBlockStart.gifContractedSubBlock.gif   dot.gif{
 7InBlock.gif      public static void Main(string[] args)
 8ExpandedSubBlockStart.gifContractedSubBlock.gif      dot.gif{
 9InBlock.gif         Console.WriteLine("Hello World");
10ExpandedSubBlockEnd.gif      }

11ExpandedSubBlockEnd.gif   }
 
12ExpandedBlockEnd.gif}

13 None.gif
14 None.gif

 

用HelloWorld.cs这个文件名来保存文件,然后就准备来见证Mono的神奇吧.在命令行中简单的输入mcs HelloWorld.cs然后敲一下回车就可以编译这个应用程序了.注意如果你是用Windows的话那么前面的命令是假定Mono的路径已经被添加到你的环境变量中,并且你的命令提示符是在HelloWorld.cs这个文件的路径下的.如果所有都做好了的话应该会显示“ Compilation succeeded“.庆祝一下吧!你已经在Mono上编译好了你的第一个C#应用程序.

用Mono来执行这个应用程序只要简单的输入mono HelloWorld.exe然后敲回车就行了.这时"Hello World"将映入你的眼帘.你刚才做的事情意味着加载了Mono JIT Runtime, JIT编译了在HelloWorld.cs这个程序集中的IL代码并且执行了这些操作.你也可以通过运行mint HelloWorld.exe命令来执行这个应用程序.这个命令使用了Mono Interpreter将应用程序的所有IL代码在执行前直接转换为X86的操作符.它和.NET中的 ngen.exe 差不多.

如果你是在Windows上使用Mono的话,那你也许已经注意到了可以通过双击这个应用程序来执行它.还有一种特殊的方法也许你还没有发现,那就是用Mono C#编译器来创建应用程序,但是却让它在Microsoft .NET Runtime上运行.这个方法将在下面的.NET and Mono interoperability 这一章节来详细讨论.

Something a little more complicated(我看了一下,对中文的支持不太好,而且有时会被服务器强制关闭连接)

Hello World作为第一个程序确实是简单了些.下一个例子有一点做作,但它展示了Mono的System.Net, System.Text,和 System.Text.RegularExpressions 命名空间的更多特性.我知道下面的代码全部都被堆到了Main方法里面,它应该被重构.但是像我说的一样,这是一个比较做作的例子,而我们现在也不是一节code style的课程.

这个例子是先取一个你想要在http://www.google.com/上搜索的字符串,然后显示搜索到的前五个结果.这也没什么,但是它看上去要比前面的Hello World稍微复杂一些.好了,再来吧,打开你喜欢的文本编辑器,输入下面的代码或者直接从文章中复制并粘贴它.

 

 1 None.gif using  System;
 2 None.gif
 3 None.gif using  System.Net;
 4 None.gif
 5 None.gif using  System.Web;
 6 None.gif using  System.Text;
 7 None.gif using  System.Text.RegularExpressions;
 8 None.gif
 9 None.gif namespace  Dela.Mono.Examples
10 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
11InBlock.gif   class GoogleSearch
12ExpandedSubBlockStart.gifContractedSubBlock.gif   dot.gif{
13InBlock.gif      static void Main(string[] args)
14ExpandedSubBlockStart.gifContractedSubBlock.gif      dot.gif{
15InBlock.gif         Console.Write("Please enter string to search google for: ");
16InBlock.gif
17InBlock.gif         string searchString = HttpUtility.UrlEncode(Console.ReadLine());    
18InBlock.gif
19InBlock.gif         Console.WriteLine();
20InBlock.gif         Console.Write("Please waitdot.gif\r");
21InBlock.gif
22InBlock.gif         // Query google.
23InBlock.gif
24InBlock.gif         WebClient webClient = new WebClient();
25InBlock.gif
26InBlock.gif         byte[] response =
27InBlock.gif              webClient.DownloadData("http://www.google.com/search?&num=5&q="
28InBlock.gif              + searchString);
29InBlock.gif
30InBlock.gif 
31InBlock.gif
32InBlock.gif         // Check response for results
33InBlock.gif
34InBlock.gif         string regex = "g>?(?[^\">]*)[^>]*>(?[^<]*)";
35InBlock.gif
36InBlock.gif         MatchCollection matches
37InBlock.gif                  = Regex.Matches(Encoding.ASCII.GetString(response), regex);
38InBlock.gif
39InBlock.gif 
40InBlock.gif
41InBlock.gif         // Output results
42InBlock.gif
43InBlock.gif         Console.WriteLine("===== Results =====");
44InBlock.gif         if(matches.Count > 0)
45ExpandedSubBlockStart.gifContractedSubBlock.gif         dot.gif{
46InBlock.gif            foreach(Match match in matches)
47ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
48InBlock.gif               Console.WriteLine(HttpUtility.HtmlDecode(
49InBlock.gif
50InBlock.gif                  match.Groups["Name"].Value) + 
51InBlock.gif
52InBlock.gif                  " - " + match.Groups["URL"].Value);
53ExpandedSubBlockEnd.gif            }

54ExpandedSubBlockEnd.gif         }

55InBlock.gif         else
56ExpandedSubBlockStart.gifContractedSubBlock.gif         dot.gif{
57InBlock.gif            Console.WriteLine("0 results found");
58ExpandedSubBlockEnd.gif         }

59ExpandedSubBlockEnd.gif      }

60ExpandedSubBlockEnd.gif   }

61ExpandedBlockEnd.gif}

62 None.gif
63 None.gif

用文件名GoogleExample.cs 将它保存,然后回到命令行.编译这个应用程序的命令和编译Hello World的那个有些不同.这个应用程序使用到了被定义在 System.Web.dll这个程序集中的HttpUtility 类.这意味着我们在编译的时候需要来引用这个程序集.这样做的时候你可以使用 -r 开关.下面是你为了编译这个应用程序所需要输入的完整命令: : mcs GoogleExample.cs -r System.Web.dll

再说一次,如果你是用Windows的话那么前面的命令是假定Mono的路径已经被添加到你的环境变量中,并且你的命令提示符是在GoogleExample.cs这个文件的路径下的.

就像Hello World那个例子一样,你可以在命令行中通过使用mono GoogleExample.exe 或者 mint GoogleExample.exe 来运行这个应用程序,挑你喜欢的用吧.被编译好的程序集可以在Windows上运行,也可以在Linux上运行.你可以测试一下,先在Windows上编译好,然后将程序集复制到Linux上,再在Linux上输入mono GoogleExample.exe 来运行它. 

.NET and Mono interoperability

在前面的Hello World那个例子中我提到过你可以用Mono编译器来创建程序集,在安装了.NET的Windows环境下可以通过双击使它运行(在那个例子中是HelloWorld.exe).它到底是怎样工作的呢?其实很简单. Mono的 C# 编译器, 和 Microsoft的 C# 编译器都将代码编译成一种中间格式,也就是IL代码.当你执行一个程序集的时候,Runtime会解释并执行IL代码.所以你可以将那些从VB.NET或是其他一些.NET语言代码所编译出来的程序集放在Mono和vice versa上来运行.但这还是有一点小问题的:Mono没有完全实现.NET所有的类库,所以并不是你的所有的应用程序都能在Mono上运行.现在不用太担心这些,在这个系列文章中的后面几篇中我们将要看看哪些可以运行,哪些不可以运行,并且来研究一下为什么会这样.

What next?

这篇文章向你演示了怎样安装Mono,并在Windows和Linux上创建运行你的第一个Mono应用程序.里面讲的内容不多.你肯定想要知道更多的东西,而不仅仅是做一个简单的控制台应用程序.我已经说过了这篇文章只是我讲解Mono,并使用Mono进行跨平台.NET开发系列文章的第一篇.下一篇我们会讲什么呢?Well,我明白可能最好就是讲跨平台的GUI应用程序了,但在这之前我想先讲一下用Mono来开发Web Application和ASP.NET:就是编写你的第一个ASP.NET应用程序,并让它运行在Linux和windows上.

Links

Microsoft ECMA/ISO Standardization page http://msdn.microsoft.com/net/ecma/

转载于:https://www.cnblogs.com/leib_0474/archive/2005/08/21/219568.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值