2.2.1 响应文件
2011-11-21 16:23 iRead 阅读(764) 评论(1) 编辑 收藏 举报在结束对编译器开关的讨论之前,我想花一点时间谈谈响应文件(response file)。响应文件是一个文本文件,其中包含一组编译器开关命令行。执行CSC.exe时,编译器会打开响应文件,并使用其中包含的任何开关,感觉就像是这些开关直接在命令行传递给CSC.exe。为了指示编译器使用一个响应文件,在命令行中,请在一个@符号之前指定响应文件的名称。例如,假定一个名为MyProject.rsp的响应文件包含以下文本:
/out:MyProject.exe
/target:winexe
为了让csc.exe使用这些设置,可以像下面这样调用它:
csc.exe @MyProject.rsp CodeFile1.cs CodeFile2.cs
这就告诉了C#编译器输出文件的名称,以及要创建的是哪种类型的应用程序。可以看出,响应文件能带来许多方便,因为不必在每次编译项目时,都人工指定需要的命令行参数。
C#编译器允许同时指定多个响应文件。除了在命令行上显示指定的文件,编译器还会自动查找两个名为CSC.rsp的文件。运行CSC.exe时,它会在当前目录查找一个本地CSC.rsp文件--应该将项目特有的所有设置都放到这个文件中。编译器还会在CSC.exe文件所在的目录查找一个全局CSC.rsp、文件。如果有一些设置想应用于自己的全部项目,就应该将这些设置放到这个文件中。编译器会汇总并使用所有这些响应文件中的设置。本地和全局响应文件中的某个设置发生冲突,将以本地文件的设置为准。类似地,命令行上显示指定的设置将覆盖本地响应文件中的设置。
安装.NET Framework时,会在%SystemRoot\Microsoft.NET\Framework\vX.X.X目录中安装一个默认的全局CSC.rsp文件(X.X.X是你安装的.NET Framework的版本号)。这个文件的4.0版本包含以下开关:
#This file contains command-line options that the C#
#command line compiler (CSC) will process as part
#of every compilation,unless the "/noconfig" option
#is specified.
#Reference the common Framework libraries
/r:Accessibility.dll
/r:Microsoft.CSharp.dll
/r:System.Configuration.dll
/r:System.Configuration.Install.dll
/r:System.Core.dll
/r:System.Data.dll
/r:System.Data.DataSetExtensions.dll
/r:System.Data.Linq.dll
/r:System.Deployment.dll
/r:System.Device.dll
/r:System.DirectoryService.dll
/r:System.dll
/r:System.Drawing.dll
/r:System.EnterpriseService.dll
/r:System.Management.dll
/r:System.Messaging.dll
/r:System.Numerics.dll
/r:System.Runtime.Remoting.dll
/r:System.Runtime.Serialization.dll
/r:System.Runtime.Serialization.Formatters.Soap.dll
/r:System.Security.dll
/r:System.ServiceModel.dll
/r:System.ServiceProcess.dll
/r:System.Transactions.dll
/r:System.Web.Services.dll
/r:System.Windows.Forms.dll
/r:System.Xml.dll
/r:System.Xml.Linq.dll
由于全局CSC.rsp文件引用了上面列出的所有程序集,所以不需要使用C#编译器的/reference开关来显式引用这些程序集。这个响应文件为开发人员带来了极大的方便,因为它允许开发人员直接使用Microsoft发布的各个程序集中定义的类型和命名空间,不必在每次编译时都指定一个/reference编译器开关。
当然,引用所有这些程序集,肯能对编译器的速度有一些影响。但是,如果源代码没有引用在上述任何程序集中定义的一个类型或成员,就不会影响最终的程序集文件,也不会影响程序的执行性能。
注意:使用/reference编译器开关引用一个程序集时,可指定到一个特定的文件的完整路径。然而,如果指定路径,编译器会在以下位置搜索文件(按所列顺序):
- 工作目录
- CSC.exe本身所在的目录。MSCorLib.dll总是从这个目录获取。路径的形式大致像这样:%SystemRoot\Microsoft.NET\Framework\v4.0.#####。
- 使用/lib编译器开关指定的任何目录
- 使用LIB环境变量指定的任何目录
当然,如果想进一步简化操作,还可以在全局CSC.rsp文件中添加你自己的开关。但这样一来,在其他机器上复制代码生成(build)环境就比较困难了:在每一台用于生成的机器上,都必须以相同的方式更新CSC.rsp。另外,可以指定/noconfig命令行开关,告诉编译器忽略局部和全局CSC.rsp文件。