代码改变世界

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文件。

 

  返回目录