在 .NET 程序集的开发和测试期间,在命令行定义符号可能有所帮助。这样做可以快速地即时指定符号,而不必更新代码基。为了进行说明,假设您希望在命令行定义 DEBUG 符号,则请使用 /define 选项:
csc /define:DEBUG *.cs当您再次运行该应用程序时,您应当看到显示“DEBUG symbol defined”— 即使 #define 语句已经被注释掉。
即使是最好的程序员,有时也会发现有对他们的代码基进行调试的需要。尽管我假设大多数读者更喜欢使用 Visual Studio .NET 进行调试活动,但对 csc.exe 的一些以调试为中心的选项(表 6)进行说明是值得的。
表 6. csc.exe 的以调试为中心的选项
csc.exe 的以调试为中心的选项
定义
/debug
指示 csc.exe 发出一个 *.pdb 文件,以供调试工具(例如,cordbg.exe、dbgclr.exe 或 Visual Studio)使用。
/warnaserror
将所有警告视为严重错误。
/warn
使您可以指定当前编译的警告级别(0、1、2、3 或 4)。
/nowarn
使您可以禁用特定的 C# 编译器警告。
/bugreport
如果应用程序在运行时出现故障,则该选项可生成错误日志。该选项将提示您输入纠正信息以发送到您希望的任何地方(例如,QA 小组)。
要说明 /debug 选项的用法,我们首先需要在我们的 finalEx.cs 代码文件中插入一些编码错误。请将以下代码添加到当前的 Main() 方法中:
// Create an array. string[] myStrings = {"Csc.exe is cool"}; // Go out of bounds. Console.WriteLine(myStrings[1]);正如您可以看到的那样,我们试图使用越界索引访问我们的数组的内容。如果您重新编译和运行该程序,则会得到 IndexOutOfRangeException。尽管我们可以明显地指出该错误,但假如是一个不那么明显的更为复杂的错误,又该怎么办呢?
要调试使用 csc.exe 创建的程序集,第一步是生成包含各种 .NET 调试实用工具所需信息的 *.pdb 文件。为此,请输入下列命令(它们在功能上是等效的)之一:
csc /debug *.cs csc /debug+ *.cs此时,您应当在应用程序目录中看到一个名为 finalEx.pdb 的新文件,如图 12 所示。
图 12. 应用程序目录中的新 finalEx.pdb
可以根据情况用 full 或 pdbonly 标记限定 /debug 标志。当您指定 /debug:full(它是默认标记)时,将以适当的方式对程序集进行修改,以使其可以附加到当前正在执行的调试器。既然该选项能够 影响所产生的 .NET 程序集的大小和速度,那么请确保只在调试过程中指定该选项。因为 full 是 /debug 标志的默认行为,所以上述所有选项在功能上是等效的:
csc /debug *.cs csc /debug+ *.cs csc /debug:full *.cs另一方面,指定 /debug:pdbonly 可以生成一个 *.pdb 文件,以及一个只能在程序由调试工具直接启动时进行调试的程序集:
csc /debug:pdbonly *.cs在任何情况下,既然您具有必需的 *.pdb 文件,那么您就可以使用许多调试工具(cordbg.exe、dbgclr.exe 或 Visual Studio)调试应用程序。为了不偏离本文的重点介绍命令行这一特征,我们将使用 cordbg.exe 实用工具调试该程序:
cordbg finalEx.exe在调试会话开始以后,您就可以使用 so(单步执行)命令单步执行每个代码行了。当您单击出错的代码行时,您可以找到如图 13 所示的代码转储。
图 13. 单步执行命令代码转储
要终止 cordbg.exe 实用工具,请键入 exit 并按 Return 键。
注 本文的重点不是解释 .NET 调试工具的用法。如果您希望了解有关在命令行进行调试的过程的更多信息,请在 Visual Studio 帮助系统内查找“cordbg.exe”。
至此,您已经了解了 C# 命令行编译器的核心选项背后的详细信息。为了使本文的内容更加完整,表 7 简要描述了我尚未谈论到的其余标志。
表 7. csc.exe 的其余选项
csc.exe 的其余选项
定义
/baseaddress
该选项使您可以指定加载 *.dll 的预期基址。默认情况下,该基址由 CLR 选择。
/checked
指定溢出数据类型界限的整数运算是否会在运行时导致异常。
/codepage
指定要用于编译中的所有源代码文件的代码页。
/filealign