(接上篇)在讨论完编译器开关之前, 我愿意讨论一下响应文件(response file), 一个响应文件是一个文本文件, 它包含着一组编译器命令行开关, 当你执行CSC.exe时, 编译器打开这个响应文件并使用每一行开关, 就像这些开关是传递给CSC.exe的命令行一样. 你可以在命令行中通过指定响应文件的名字来命令编译器使用这个文件, 例如, 你可能有如下的响应文件: MyProject.rsp, 它包含着如下的文本:
/out:MyProject.exe
/target:winexe
为了让CSC.exe使用这个设置, 你可以这样调用它:
csc.exe @MyProject.rsp CodeFile1.cs CodeFile2.cs
这告诉编译器输出文件的名字和创建的目标类型, 正像你看到的, 响应文件是非常方便的, 因为你不需要每次编译你的项目都手动地表达所需要的命令行开关.
C#编译器支持多个响应文件, 除了你在命令行中显示地指定的文件之外, 编译器会自动地寻找CSC.rsp响应文件. 当你运行CSC.exe时, 它会在当前的目录中寻找一个局部CSC.rsp文件——你应该把任何项目相关的设置放在这个文件中. 编译器也会在包含CSC.exe文件来寻找这个文件来作为全局的CSC.rsp文件. 把你想对所有的项目的设置放在这个文件中, 编译器会聚集和使用所有这些响应文件中的设置. 如果在局部和全局响应文件中存在着冲突的话, 那么在局部文件中的设置将会覆盖全局文件中的设置, 同样, 显示地传递给命令行的任何设置也会覆盖局部响应文件中的设置.
当你安装.NET Framework时, 它会在%SystemRoot%\Microsoft.NET\Framework\vX.X.X目录下(X.X.X是你所安装的.NET Framework的版本号)安装一个默认的全局CSC.rsp文件. 在2.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.Vsa.dll
/r:System.Configuration.dll
/r:System.Configuration.Install.dll
/r:System.Data.dll
/r:System.Data.OracleClient.dll
/r:System.Data.SqlXml.dll
/r:System.Deployment.dll
/r:System.Design.dll
/r:System.DirectoryServices.dll
/r:System.dll
/r:System.Drawing.Design.dll
/r:System.Drawing.dll
/r:System.EnterpriseServices.dll
/r:System.Management.dll
/r:System.Messaging.dll
/r:System.Runtime.Remoting.dll
/r:System.Runtime.Serialization.Formatters.Soap.dll
/r:System.Security.dll
/r:System.ServiceProcess.dll
/r:System.Transactions.dll
/r:System.Web.dll
/r:System.Web.Mobile.dll
/r:System.Web.RegularExpressions.dll
/r:System.Web.Services.dll
/r:System.Windows.Forms.Dll
/r:System.Xml.dll
因为全局CSC.rsp文件引用了列出来的所有的程序集, 你不需要在C#编译器/reference开关中显示地引用这些程序集, 这个响应文件对于开发者是一个很大到的方便, 因为它允许开发者使用定义在各种不同的微软发布的程序集中的类型和名字空间, 而不必在编译每个程序时都指定/reference编译器开关.
引用所有这些程序集会使得编译器变慢一些, 但是如果你的源代码不引用定义在这些程序集中的任何一个类型或者成员, 对产生的程序集文件没有影响, 对run-time执行性能也没有影响.
注意: 当你使用/reference编译器开关来引用一个程序集时, 你可以指定指向一个特定文件的完整路径, 然而, 如果你不指定路径, 编译器将会在如下几个地方搜索这个程序集文件(按照列表的顺序):
1. 工作目录
2. 包含CSC.exe文件的目录, MSCorLib.dll总是在这个目录中. 这个路径看起来像: %SystemmRoot%\Microsoft.NET\Framework\v2.0.50727
3. 通过/lib编译器开关指定的任何目录
4. 通过LIB环境变量制定的任何目录
当然如果你想让你的生活变得更加轻松, 欢迎你把自己的开关加入到这个全局CSC.rsp文件中, 但是这会使得在不同机器上复制构建环境变得困难: 你必须记住在每个build机器上以相同的方式更新CSC.rsp文件. 你也可以通过指定/noconfig命令行开关来告诉编译器忽略局部和全局CSC.rsp文件.