2.4 使用csc.exe响应文件
可以想象,如果要在命令提示符下构建一个复杂的C#应用程序,那么键入大量的标志以指定被引用程序集和*.cs导入文件,是一项苦不堪言的工作。为了减轻录入负担,C#编译器采用了响应文件(response file)。
C#响应文件包含了在当前构建的编译期间要用到的所有指令。通常约定,这些文件的扩展名为*.rsp。假定已经创建了一个包含有以下参数的名为TestApp.rsp的响应文件(注释用#字符标识):
# 这是第2章里的TestApp.exe应用程序的响应文件。
# 外部程序集引用。
/r:System.Windows.Forms.dll
# 用于编译的输出和文件(采用通配符语法)。
/target:exe /out:TestApp.exe *.cs
现在,假定该文件与将被编译的C#源代码文件保存在相同的目录里,这样就能按照以下步骤构建完整的应用程序了(注意采用了@符号):
csc @TestApp.rsp
如果需要,也可以指定多个*.rsp文件作为输入(例如csc @FirstFile.rsp @SecondFile.rsp @ThirdFile.rsp)。如果采用这种方式,要记住编译器会根据所遇到的命令选项做相应的处理!因而,后面*.rsp文件中的命令行参数可以覆盖前一个响应文件的选项。
还要注意,在响应文件前的命令行中被显式列出来的标志将被指定的*.rsp文件覆盖,因此,如果键入:
csc /out:MyCoolApp.exe @TestApp.rsp
假定有在TestApp.rsp响应文件里/out:TestApp.exe标志,程序集的名字将仍然是TestApp.exe而非MyCoolApp.exe。但是,如果在响应文件后列出了标志,标志将覆盖响应文件里的设置。
注解 /reference标志具有累加性。不管在何处指定了外部程序集(之前、之后或是在响应文件内),最终的结果都是各个引用程序集的累加之和。
默认的响应文件(csc.rsp)
关于响应文件,最后要说明一点,C#编译器有一个相关联的默认响应文件(csc.rsp),该默认响应文件与csc.exe同处在一个目录里(例如C:\Windows\Microsoft.NET\Framework\v2.0.50215)。如果用记事本打开这个文件,将发现无数的.NET程序集已经使用/r:标志被指定。
当用csc.exe构建C#程序时,该文件将自动被引用,即使你提供了一个自定义的*.rsp文件。假定有默认的响应文件存在,当前的TestApp.exe应用程序可以用以下命令集成功地进行编译(System.Windows.Forms.dll在csc.rsp内被引用):
csc /out:TestApp.exe *.cs
如果希望取消自动读取csc.rsp,可以指定/noconfig选项:
csc @TestApp.rsp /noconfig
很明显,C#命令行编译器还有很多其他选项,用于控制如何产生结果.NET程序集。如果你希望学习csc.exe功能的更多细节,可以查阅我在http://msdn.microsoft.com上发表的文章Working with the C# 2.0 Command Line Compiler(使用C# 2.0命令行编译器)[1]。






