代码改变世界

2.2 将类型生成到模块中

2011-11-21 16:12  iRead  阅读(288)  评论(0编辑  收藏  举报

  本节要讨论如何将包含多个类型的源代码文件生成为一个可以部署的文件。先来看看这个简单的应用程序:

public sealed class Program{
    public static void Main()
    {
        System.Console.WriteLine("Hi");
    }
}

  应用程序定义了一个名为Program的类型,其中有一个名为Main的public static方法。Main中引用了另一个名为System.Console的类型。System.Console是Microsoft已经实现好的一个类型,用于实现这个类型的各个方法的IL代码存储在MSCorLib.dll文件中。所以,这个应用程序定义了一个类型,并使用了由别的公司提供的一个类型。

  为了生成这个示例应用程序,请将上述代码放到一个源代码文件中(假定为Program.cs),然后在命令行中执行以下命令1
  csc.exe /out:Program.exe /t:exe /r:MSCorLib.dll Program.cs

  这个命令行指示C#编译器生成一个名为Prgoram.exe的可执行文件(/out:Program.exe)。生成的文件属于Win32控制台应用程序类型(/t[arget]:exe)。

  C#编译器处理源文件时,发现代码引用了System.Console类型的WriteLine方法。此时,编译器要核实该类型确实存在于某处,它确实有一个WriteLine方法,而且传给这个方法的实参与方法指定的形参相匹配。由于这个类型在C#源代码中没有定义,所以为了顺利通过编译,必须向C#编译器提供一组程序集,使它能解析对外部类型的引用。在上述命令行中,我添加了/r[eference]:MSCorLib.dll开关,告诉编译器在MSCorLib.dll文件所代码的程序集中查找外部类型。

  MSCorLib.dll是一个比较特殊的文件,因为它包含了所有的核心类型:Byte,Char,String,Int32等等。事实上,由于这些类型被使用得如此频繁,以至于C#编译器会自动引用MSCorLib.dll程序集。换言之,命令行其实可以简化成下面这样(省略/r开关):

  csc.exe /out:Program.exe /t:exe Program.cs

  此外,由于/out:Program.exe和/t:exe命令行开关是C#编译器的默认设定,所以命令行可继续简化成下面这样:

  csc.exe Program.cs

  如果出于某种原因,你不希望C#编译器自动引用MSCorLib.dll程序集,那么可以使用/nostdlib开关。Microsoft生成MSCorLib.dll程序集自身的时候便使用了这个开关。例如,用以下命令行编译Program.cs时会报错,因为System.Console类型是在MSCorLib.dll中定义的:

  csc.exe /out:Program.exe /t:exe /nostdlib Program.cs

  现在,让我们更深入地研究一下C#编译器生成的Program.exe文件。这个文件到底是什么?首先,它是一个标准的PE(可移植执行体,Portable Executable)文件。这意味着运行32位或64位Windows的一台计算机能加载这个文件,并通过它执行某些操作。Windows支持两种类型的应用程序:具有控制台用户界面(CUI)的,和具有图形用户界面(GUI)的。由于指定了/t:exe开关,所以C#编译器生成的是一个CUI应用程序。使用/t:winexe开关,则可让C#编译器生成一个GUI应用程序。

 

  返回目录


  1、不要在普通的命令行窗口中进行编译。如果你安装了Visual Studio,请在Visual Studio程序组中打开“Visual Studio Tools”文件夹,再单击“Visual Studio 命令提示”链接。