Mono初探--创建你的第一个Mono应用程序 (三)
Your Mono toolset
到这里的时候你可能已经放弃了,或者跟了下来.我们剩下要做的已经不多了.我们已经安装好了Mono和一些我们准备用来编译并运行C#应用程序的工具.在我们开始编写并运行应用程序之前,我觉得最好先稍微看一下目前已经可以使用的那些工具的简介,这只是其中的一部分工具.
Tool |
Description |
disco |
Mono的 Web Service Discovery 工具 |
gacutil |
全局程序集缓存管理工具 这是一个开发者用来将某个程序集安装到系统的全局程序集缓存的工具.这样做的目的是将这些程序集变成对所有应用程序在运行时都可用的程序集的一部分. |
ilasm |
Mono IL 编译器 这是 Mono IL 代码编译器. 就和Microsoft的 ilasm.exe这个工具一样. |
mcs |
Mono Compiler Suite. |
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程序集上的进行数字 签名/验证/比较 的强命名工具 |
soapsuds |
Mono的远程代理生成器 这个是用来生成WSDL文档和远程服务的客户端代理的工具. |
wsdl |
Mono的 Web Service 代理生成器 |
xsd |
Mono用来生成 schema 或 class 文件的工具 |
要记住,这仅仅那些可以用到的工具的一个子集.如果你对所有工具都感兴趣的话你应该看一下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.然后输入下面的代码,其实更简单的方法是直接从文章中把它复制并粘贴上去.
2
3namespace Dela.Mono.Examples
4{
5 public class HelloWorld
6 {
7 public static void Main(string[] args)
8 {
9 Console.WriteLine("Hello World");
10 }
11 }
12}
13
14
用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稍微复杂一些.好了,再来吧,打开你喜欢的文本编辑器,输入下面的代码或者直接从文章中复制并粘贴它.
2
3using System.Net;
4
5using System.Web;
6using System.Text;
7using System.Text.RegularExpressions;
8
9namespace Dela.Mono.Examples
10{
11 class GoogleSearch
12 {
13 static void Main(string[] args)
14 {
15 Console.Write("Please enter string to search google for: ");
16
17 string searchString = HttpUtility.UrlEncode(Console.ReadLine());
18
19 Console.WriteLine();
20 Console.Write("Please wait\r");
21
22 // Query google.
23
24 WebClient webClient = new WebClient();
25
26 byte[] response =
27 webClient.DownloadData("http://www.google.com/search?&num=5&q="
28 + searchString);
29
30
31
32 // Check response for results
33
34 string regex = "g>?(?[^\">]*)[^>]*>(?[^<]*)";
35
36 MatchCollection matches
37 = Regex.Matches(Encoding.ASCII.GetString(response), regex);
38
39
40
41 // Output results
42
43 Console.WriteLine("===== Results =====");
44 if(matches.Count > 0)
45 {
46 foreach(Match match in matches)
47 {
48 Console.WriteLine(HttpUtility.HtmlDecode(
49
50 match.Groups["Name"].Value) +
51
52 " - " + match.Groups["URL"].Value);
53 }
54 }
55 else
56 {
57 Console.WriteLine("0 results found");
58 }
59 }
60 }
61}
62
63
用文件名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
- The Mono Homepage - http://www.mono-project.com/
- The Mono Download Page - http://www.mono-project.com/downloads/index.html
- ECMA C# Language Specification - http://www.ecma-international.org/publications/standards/Ecma-334.htm
- ECMA Common Language Infrastructure (CLI) - http://www.ecma-international.org/publications/standards/Ecma-335.htm
Microsoft ECMA/ISO Standardization page http://msdn.microsoft.com/net/ecma/