注 在继续操作之前,请确保将 airvehicals.dll 和 ufo.netmodule 二进制文件复制到 WinFormClient 目录中。
要将该应用程序编译为 Windows 窗体可执行文件,请确保指定 winexe 作为 /target 标志的修饰。请注意,在引用多文件程序集时,只须指定主模块的名称:
csc /t:winexe /r:airvehicles.dll *.cs
在运行您的程序并单击按钮之后,您就应当看到按照预期显示的每个消息框。图 9 显示了我创建的一个消息框。
图 9. 示例消息框
返回页首下一个议程是分析如何使用 csc.exe 将资源(例如,字符串表或图像文件)嵌入到 .NET 程序集中。首先,可以使用 /win32Icon 选项指定 Win32 *.ico 文件的路径。假设您已经将一个名为 HappyDude.ico 的图标文件放到当前 Windows 窗体应用程序的应用程序目录中。要将 HappyDude.ico 设置为可执行文件的图标,请发出以下命令集:
csc /t:winexe /win32icon:HappyDude.ico /r:airvehicles.dll *.cs
此时,应当更新可执行程序集,如图 10 所示。
图 10. 经过更新的可执行程序集
除了使用 /win32icon 分配应用程序图标以外,csc.exe 还提供了三个附加的以资源为中心的选项(表 5)。
表 5. csc.exe 的以资源为中心的选项
csc.exe 的以资源为中心的选项 | 定义 |
/resource | 将 *.resources 文件内部包含的资源嵌入到当前程序集中。请注意,通过该选项可以“以公共方式”嵌入资源以供所有使用者使用,或者“以私有方式”嵌入资源以便仅供包含程序集使用。 |
/linkresource | 在程序集清单中记录指向外部资源文件的链接,但实际上并不嵌入资源自身。 |
/win32res | 使您可以嵌入存在于旧式 *.res 文件中的资源。 |
在我们了解如何将资源嵌入到我们的程序集中以前,请让我对 .NET 平台中的资源的性质进行简短的介绍。正如您可能已经知道的那样,.NET 资源开始时通常呈现为一组被记录为 XML(*.resx 文件)或简单文本 (*.txt) 的名称/值对。该 XML/文本文件随后被转换为等效的二进制文件,它采用 *.resources 文件扩展名。然后,这些二进制文件被嵌入到程序集中并且被记录在清单中。当需要以编程方式从该程序集中读取资源的时候,System.Resources 命名空间会提供很多类型来完成该工作,其中最值得注意的是 ResourceManager 类。
尽管您肯定可以手动创建 *.resx 文件,但您最好使用 resgen.exe 命令行工具(或者,您当然可以使用 Visual Studio .NET 本身)。虽然本文不打算描述 resgen.exe 的全部详细信息,但是让我们演练一个简单的示例。
使用 /resource 嵌入资源
在 MyCSharpCode 下面创建一个名为 MyResourceApp 的新目录。在该目录中,使用 notepad.exe 创建一个名为 myStrings.txt 的新文件,并且使其包含您选择的一些有趣的名称/值对。例如:
# A list of personal data#company=Intertech TraininglastClassTaught=.NET SecuritylastPresentation=SD East Best PracticesfavoriteGameConsole=XBoxfavoriteComic=Cerebus
现在,使用命令提示,通过以下命令将 *.txt 文件转换为一个基于 XML 的 *.resx 文件:
resgen myStrings.txt myStrings.resx
如果您使用 notepad.exe 打开该文件,则会找到许多描述名称/值对的 XML 元素,例如:
<data name="company"> <value xml:space="preserve">Intertech Training</value></data><data name="lastClassTaught"> <value xml:space="preserve">.NET Security</value></data>
要将该 *.resx 文件转换为二进制的 *.resources 文