// Create an array.string myStrings = {"Csc.exe is cool"};// Go out of bounds.Console.WriteLine(myStrings);
正如您可以看到的那样,我们试图使用越界索引访问我们的数组的内容。如果您重新编译和运行该程序,则会得到 IndexOutOfRangeException。尽管我们可以明显地指出该错误,但假如是一个不那么明显的更为复杂的错误,又该怎么办呢?
要调试使用 csc.exe 创建的程序集,第一步是生成包含各种 .NET 调试实用工具所需信息的 *.pdb 文件。为此,请输入下列命令(它们在功能上是等效的)之一:
csc /debug *.cscsc /debug+ *.cs
此时,您应当在应用程序目录中看到一个名为 finalEx.pdb 的新文件,如图 12 所示。
图 12. 应用程序目录中的新 finalEx.pdb
可以根据情况用 full 或 pdbonly 标记限定 /debug 标志。当您指定 /debug:full(它是默认标记)时,将以适当的方式对程序集进行修改,以使其可以附加到当前正在执行的调试器。既然该选项能够 影响所产生的 .NET 程序集的大小和速度,那么请确保只在调试过程中指定该选项。因为 full 是 /debug 标志的默认行为,所以上述所有选项在功能上是等效的:
csc /debug *.cscsc /debug+ *.cscsc /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 | 该选项控制输出程序集内部的节大小调整(512、1024、2048、4096 或 8192 字节)。如果目标设备是手持型设备(例如,Pocket PC),则可以使用 /filealign 指定可能存在的最小节。 |
/langversion | 该选项指示编译器只使用 ISO-1 C# 语言功能,它基本上可以归结为 C# 1.0 语言功能。 |
/main | 如果当前项目定义了多个 Main() 方法(这在单元测试期间可能有所帮助),则可以使用该标志指定在程序集加载时执行哪个 Main() 方法。 |
/nostdlib | 默认情况下,程序集清单自动引用 mscorlib.dll。指定该选项可以禁止这一行为。 |
/optimize | 当被启用 (/optimize+) 时,可指示编译器尽可能生成最小且最快的程序集。该选项会发出还指示 CLR 在运行时优化代码的元数据。 |
/platform | 该标志告诉编译器针对 32 位或 64 位处理器优化程序集。一般来说,该选项只在 C# 代码基使用 P/Invoke 和/或不安全的代码结构时有用。默认值是“anycpu”。 |
/unsafe | 当被启用时,该选项使 C# 文件可以声明不安全的作用范围,这通常用于操纵 C++ 样式指针。 |
/utf8output | 该选项告诉编译器使用 UTF-8 编码输出数据。 |
需