1)将包含多个类型的源代码文件生成为一个可以部署的文件
先看下面代码:
1 public sealed class Program { 2 public static void Main() { 3 System.Console.WriteLine("Hi"); 4 } 5 }
csc.exe /out:SimpleProgram.exe /t:exe /r:MSCorLib.dll SimpleProgram.cs
提示:
/out:SimpleProgram.exe 默认路径为C:\Program Files\Microsoft Visual Studio *.*\VC
也可以设置绝对路径,SimpleProgram.cs 要使用绝对路径。
这个命令行指示C#编译器生成一个名为Program.exe 的可执行文件(/out:Program.exe )。生成的文件属于Win32 控制台应用程序类型(/t[arget]:exe)。
C#编译器处理源文件时,发现代码引用了System.Console 类型的WriteLine 方法。此时,编译器要核实该类型确实存在于某处,它确实有一个WriteLine 方法,而且传给这个方法的实参与方法指定的形参相匹配。由于这个类型在C#源代码中没有定义,所以为了顺利通过编译,必须向C#编译器提供一组程序集,使它能解析对外部类型的引用。在上述命令行中,我添加了/[eference]:MSCorLib.dll 开关,告诉编译器在MSCorLib.dll 文件所代表的程序集中查找外部类型。
*MSCorLib.dll 包含了所有核心类型:Byte,Char,String,Int32 等等。由于这些类型被使用得如此频繁,C#编译器会自动引用MSCorLib.dll 程序集。如果不想C#编译器会自动引用MSCorLib.dll 程序集,可以使用 /nostdlib 命令。
*Windows支持两种类型的应用程序:具有控制台用户界面(CUI)的,和具有图形用户界面(GUI)的。由于指定了/t:exe开关,所以C#编译器生成的是一个CUI应用程序。使用/t:winexe 开关,则可让C#编译器生成一个GUI 应用程序。
2)相应文件
响应文件(response file)是一个文本文件,其中包含一组编译器命令行开关。执行CSC.exe 时,编译器会打开响应文件,并使用其中包含的任何开关,感觉就像是这些开关直接在命令行上传递给CSC.exe。为了指示编译器使用一个响应文件,在命令行中,请在一个@符号之后指定响应文件的名称。例如,假定一个名为MyProject.rsp 的响应文件包含以下
文本:/out:SimpleProgram.exe
/target:winexe为了让CSC.exe 使用这些设置,可以像下面这样调用它:
csc.exe @MyProject.rsp SimpleProgram.cs
使用响应文件就不用每次都指定需要的命令了。
C#编译器允许同时指定多个响应文件。除了在命令行上显式指定的文件,编译器还会自动查找两个名为CSC.rsp 的文件(书上是这么写的,笔者只发现一个全局的,没有发现用于特定项目的。ps:网上大多直接照书上写,自己不亲身尝试,很不负责。有知情者,拍砖指教)。运行CSC.exe 时,它会在当前目录查找一个本地CSC.rsp 文件——应该将项目特有的所有设置都放到这个文件中。编译器还会在CSC.exe 文件所在的目录查找一个全局CSC.rsp 文件。如果有一些设置想应用于自己的全部项目,就应该将这些设置放到这个文件中。编译器会汇总并使用所有这些响应文件中的设置。本地和全局响应文件中的某个设置发生冲突,将以本地文件的设置为准。类似地,命令行上显式指定的设置将覆盖本地响应文件中的设置。
安装.NET Framework 时,会在%SystemRoot%\Microsoft.NET\Framework\vX.X.X 目录中安装一个默认的全局CSC.rsp 文件(X.X.X 是你安装的.NET Framework 的版本号)。由于全局CSC.rsp 文件引用了响应文件列出的所有程序集,所以不需要使用C#编译器的/reference 开关来显式引用这些程序集。这个响应文件为开发人员带来了极大的方便,因为它允许开发人员直接使用Microsoft 发布的各个程序集中定义的类型和命名空间,不必在每次编译时都指定一个/reference 编译器开关。当然,引用所有这些程序集,可能对编译器的速度有一些影响。但是,如果源代码没有引用在上述任何程序集中定义的一个类型或成员,就不会影响最终的程序集文件,也不会影响程序的执行性能。
注意:使用/reference 编译器开关引用一个程序集时,可指定到一个特定文件的完整路径。然而,如果不指定路径,编译器会在以下位置搜索文件(按所列顺序):
*工作目录 *CSC.exe 本身所在的目录。MSCorLib.dll 总是从这个目录获取。路径的形式大致像这样:%SystemRoot%\Microsoft.NET\Framework\v4.0.##### 。 *使用/lib 编译器开关指定的任何目录 *使用LIB 环境变量指定的任何目录提示:可以指定/noconfig 命令行开关,告诉编译器忽略局部和全局CSC.rsp 文件。