响应文件(它们按照约定采用 *.rsp 文件扩展名)包含您希望供给到 csc.exe 中的所有选项。在创建了该文件以后,您就可以将它的名称指定为 C# 编译器的唯一选项。为了便于说明,下面提供了一个将用于生成 MyCodeLibrary.dll 的响应文件(请注意,您可以使用 # 符号指定注释)。
# MyCodeLibraryArgs.rsp # # These are the options used # to compile MyCodeLibrary.dll # Output target and name. /t:library /out:MyCodeLibrary.dll # Location of C# files. /recurse:*.cs # Give me an XML doc. /doc:myDoc.xml # Give me a strong name as well. /keyfile:C:\MyKeyPair\myKeypair.snk给定该文件以后,您现在就可以使用 @ 选项指定 MyCodeLibraryArgs.rsp 了:
csc @MyCodeLibraryArgs.rsp如果您愿意,则可以指定多个响应文件:
csc @MyCodeLibraryArgs.rsp @MoreArgs.rsp @EvenMoreArgs.rsp请记住,按照遇到的顺序对响应文件进行处理。因此,以前的文件中的设置可能被以后的文件中的设置重写。
默认的响应文件和 /noconfig 选项
最后,请记住有一个默认的响应文件 — csc.rsp,它由 csc.exe 在每次编译期间自动处理。如果您分析该文件(它与 csc.exe 本身位于相同的文件夹中)的内容,则您将只是发现一组经常引用的程序集(System.Windows.Forms.dll、System.Data.dll 等等)。
在您希望禁止包括 csc.rsp 的极少数的场合中,您可以指定 /noconfig 标志:
csc /noconfig @MyCodeLibraryArgs.rsp注 如果您引用程序集,而实际上并不使用它,则它将不会在程序集清单中列出。因此,请不要担心代码膨胀问题,因为它们根本不存在。
此时,我们已经使用命令行编译器创建了具有强名称(并且进行了说明)的单文件代码库。现在,我们需要一个客户端应用程序以便使用它。请在 C:\MyCSharpCode 中创建一个名为 MyClient 的新文件夹。在该文件夹中,创建一个新的 C# 代码文件 (simpleTypeClient.cs),该文件从程序的入口点调用静态的 SimpleType.DisplayEnvironment() 方法:
// simpleTypeClient.cs using System; // Namespace in MyCodeLibrary.dll using MyCodeLibrary; namespace MyClientApp { public class MyApp { public static void Main() { SimpleType.DisplayEnvironment(); Console.ReadLine(); } } }因为我们的客户端应用程序要使用 MyCodeLibrary.dll,所以我们需要使用 /reference(或只是使用 /r)选项。该标志很灵活,因为您可以指定所讨论的 *dll 的完整路径,如下所示:
csc /t:exe /r:C:\MyCSharpCode\MyCodeLibrary\MyCodeLibrary.dll *.cs或者,如果私有程序集的副本与输入文件位于相同的文件夹中,则可以只指定程序集名称:
csc /t:exe /r:MyCodeLibrary.dll *.cs请注意,我没有指定 /out 选项。给定该条件,csc.exe 基于我们的初始输入文件 (simpleTypeClient.cs) 创建了一个名称。此外,已知 /target 的默认行为是生成基于控制台的应用程序,所以 /t:exe 参数是可选的。
在任何情况下,因为 MyCodeLibrary.dll 是私有程序集,所以您需要将该库的一个副本放到 MyClient 目录中。在您完成该工作以后,您就能够执行 simpleTypeClient.exe 应用程序。图 7 显示了可能的测试运行。
图 7. 可能的测试运行输出
注 请回忆一下这个问题,不必将具有强名称的程序集部署到全局程序集缓存 (GAC) 中。实际上,因为强名称具有天然的安全性方面的好处,所以向每个程序集(无论共享与否)提供强名称是一种 .NET 最佳策略。
引用多个外部程序集
如果您希望在命令行引用大量程序集,则可以指定多个 /reference 选项。为了说明这一点,假设我们的客户端应用程序需要使用包含在名为 NewLib.dll 的库中的类型:
csc /t:exe /r:MyCodeLibrary.dll /r:NewLib.dll *.cs作为一种稍微简单一些的替代方法,您可以使用单个 /reference 选项,并且使用分号分隔的列表指定每个程序集:
csc /t:exe /r:MyCodeLibrary.dl;NewLib.dll *.cs当然,在创作 C# 响应文件时使用相同的语法。
关于 /lib 的简短说明
在查看 C# 2.0 程序集别名的作用之前,请允许我对 /lib 标志加以简短说明。该选项可用于将包含由 /reference 选项指定的程序集的目录告诉给 csc.exe。为了进行说明,假设您具有三个位于驱动器 C 的根目录中的 *.dll 程序集。要指示 csc.exe 在 C:\ 下查找 asm1.dll、asm2.dll 和 asm3.dll,需要发出以下命令集:
csc /lib:c:\ /reference:asm1.dll;asm2.dll;asm3.dll *.cs