resgen myStrings.resx myStrings.resources
此时,我们具有了一个名为 myStrings.resources 的二进制资源文件。通过 /resource 标志可以达到使用 csc.exe 将该数据嵌入到 .NET 程序集中的目的。假设我们已经创作了位于 MyResourceApp 目录中的以下 C# 文件 (resApp.cs):
// This simple app reads embedded// resources and displays them to the // console.using System;using System.Resources;using System.Reflection;public class ResApp{ private static void Main() { ResourceManager rm = new ResourceManager("myStrings", Assembly.GetExecutingAssembly()); Console.WriteLine("Last taught a {0} class.", rm.GetString("lastClassTaught")); }}
要相对于您的 myStrings.resources 文件编译该程序集,请输入以下命令:
csc /resource:myStrings.resources *.cs
因为我尚未指定 /out 标志,所以在该示例中,我们的可执行文件的名称将基于定义了 Main() 的文件 resApp.exe。如果一切正常,则在执行以后,您应当发现类似于图 11 的输出。
图 11. 输出
我希望您能够轻松地使用 csc.exe 和所选的文本编辑器创建单文件和多文件 .NET 程序集(带有资源!)。您已经学习了 csc.exe 的最常见的命令行选项,而本文的其余部分将分析一些不太常用但仍然有帮助的选项。
如果您愿意继续学习,请在 MyCSharpCode 文件夹中创建一个名为 FinalExample 的新目录。
返回页首尽管 C# 编译器没有真正预处理代码,但该语言的确允许我们使用类似于 C 的预处理器符号来定义该编译器以及与其进行交互。使用 C# 的 #define 语法,可以创建能够控制应用程序内部的执行路径的标记。
注 必须在使用任何语句或其他 C# 类型定义之前列出所定义的符号。
为了利用常见的示例,假设您希望定义一个名为 DEBUG 的符号。为此,请创建一个名为 finalEx.cs 的新文件,并将其保存在 MyCSharpCode\FinalExample 目录中:
// Define a ''preprocessor'' symbol named DEBUG. #define DEBUGusing System;public class FinalExample{ public static void Main() { #if DEBUG Console.WriteLine("DEBUG symbol defined"); #else Console.WriteLine("DEBUG not defined"); #endif }}
请注意,在我们使用 #define 定义了符号以后,我们就能够使用 #if、#else 和 #endif 关键字来有条件地检查和响应该符号。如果您现在编译该程序,则应当看到在 finalEx.exe 执行时,消息“DEBUG symbol defined”显示到控制台上:
csc *.cs
但是,如果您注释掉符号定义:
// #define DEBUG
则输出将会像您预料的那样(“DEBUG not defined”)。
在 .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 小组)。 |
要