资源是应用程序生成功能,允许您将区域性特定的项放入附属文件,而不是直接放入主应用程序。当生成应用程序时,可以标识区域性特定的特征,并为认为应用程序可能用于的每个区域性生成不同的资源文件。在运行时,将根据用户的区域性设置加载适当的一组资源。所使用的特定设置是您的“线程”(Thread) 的 CurrentUICulture,用户可以编程方式设置它。 当生成应用程序时,它被收容在“程序集”中。程序集由以下几项组成: 程序集元数据,也称作程序集清单 
类型元数据 
实现类型的 Microsoft 中间语言 (MSIL) 代码 
一组资源 
程序集清单是列表中唯一必需的项,但为赋予程序集任何有意义的功能,还需要类型或资源。资源组是完全可选的。创建了您的应用程序后,它便是程序集的组成部分,称为“主”程序集,因为它是应用程序的中心部分。应用程序的任何代码特征都是该主程序集的组成部分。如果更改了该主程序集内的任何代码,则需要重新编译整个程序集,这意味着需要大量工作来重新发布您的应用程序。 当生成供应用程序使用的外部资源组(即不是主程序集组成部分的资源)时,这些资源称为“附属程序集”。它们也要进行编译,并且有它们自己的程序集。如果任何时候需要更改附属程序集内的信息,则可以更改它而不必更改主程序集内的信息,这可节省您和您用户的时间。附属程序集可以仅由资源组成,因此没有代码。附属程序集将编译为 dll,并由主程序集引用,尽管该操作是由 ResourceManager 为您完成的:您不需要任何特定代码来通知您的程序如何引用附属程序集。 那么如何决定附属程序集内放入什么内容呢?假想您正在设计可能在多种不同区域性中使用的应用程序。如果对字符串进行硬编码,并且消息显示为“欢迎使用我们的应用程序”或“异常:不能被零除”,那么您需要考虑其他区域性无法读取这些消息的事实。此外,如果决定更改作为主程序集组成部分的任何消息,对于所做的每次更改,均将需要重新编译应用程序并重新发布。因此,可能随区域性更改的所有信息(如消息字符串或图形)都放入资源文件。这具体包括提示和异常消息或图标和位图之类的东西,如果只以英语(举例而言)放入程序,则可能不能为所有用户都理解。 第一步是标识所有语言或区域性特定的字符串消息项,并将它们放入一个文本文件中。如果拥有可能需要成为区域性特定的图片或其他数据,也将它们注出。以下是会包含在文件(名为 strings.txt)中的内容类型的示例。名称“strings”成为我们资源的根名称,它在以后检索资源时很重要。该名称是任意的,但 strings(字符串)对于由字符串项组成的文件意义比较明确。 ;the welcome statement we want to make...
welcome = Welcome to our application!;the prompts for the main screen
PromptName = Please enter your name ==>
PromptState = Please enter the State you live in ==>;the exception message
NameErr = You must specify your last name
AddressErr = Please ensure you enter the address field; etc...前面有个分号的行是该文件中的注释,它们供您自己使用,以帮助阐明信息的组织方式。它们对于信息的读取或解释方式没有任何最终影响。该文件中的每个实际项都包括一个引用名(等号前的项),然后是您要给出的字符串(跟在等号后)。当生成您的第一个文件时,您应为将在其中查看该信息的主要区域性创建项。在该演示中,假定应用程序将主要由美国英语用户使用,因此为该特定区域性生成您的第一组项。 创建文件后,可以生成其他类似文件,对于希望您的应用程序存在于的每个区域性生成一个文件。可以在任何时间进行该工作,在晚些时候为用户提供特定区域性支持(甚至在产品交付以后),使您可以集中进行核心应用程序的开发。当为其他区域性生成文件时,请确保为区域性特定的文件提供与基文件相同的名称,仅通过将区域性名称嵌入文件名称内来区分这些文件的名称(请参阅下面的示例)。 最好将这些文件组织在子文件夹中(这有助于接下来的步骤)。在本示例中,将设计用于美国、新西兰和德国的应用程序。因此,主要的 (strings.txt) 文件是默认文件(位于主程序集将驻留的同一位置),但还生成了其他两个文件,并将它们像下图所示那样组织在应用程序目录中。 
app directory
      |
      ----->   strings.txt               default text resources
      ----->   myApp.cs  or  myApp.vb    our application source file (C# or VB)
      |
      ----->   en-NZ                   New Zealand directory
      |          |
      |          -----> strings.en-NZ.txt    New Zealand text resources,
      |                                      culture embedded in filename
      |
      ----->   de                   German directory
                 |
                 -----> strings.de.txt       German text resources,
                                             culture embedded in filename您可能想知道子目录名称的出处。为每种主要语言都提供了两个小写字母表示的缩写,如 en 代表英语或 bg 代表保加利亚语。对于子区域性或其他区域,开发了辅助的大写缩写。这使您可以标识区域性与区域特定组合,如 en-CA 代表加拿大英语,或 fr-CA 代表加拿大法语。在上面的示例中,de 表示德语(不管子区域设置是什么)。正确为这些目录命名很重要,因为以后将搜索它们以获得资源。如果命名不正确,那么系统将不能找到您的资源。 现在已有了目录结构,下一步是实际创建资源文件。到现在为止,您已生成了可读的文本文件,但这些文件需要翻译成可供应用程序使用的文件。这可通过代码完成(请参阅如何读写资源),但在本示例中,最简单的解决方案是使用名为 Resgen 的应用程序(资源生成器)。Resgen 可接受 .txt 文件并将它们变成 .resources 文件,然后这些 .resources 文件可用于接下来的步骤。若要这样做,请从命令提示处调用 Resgen,指定要转换为 .resources 文件的 .txt 文件,如本示例中所示。如果需要,可为输出文件指定不同的名称,作为 Resgen 实用工具的第二个参数。 
;from inside your app directory
;output file is strings.resources, in this directory
resgen strings.txt
;from inside the en-NZ directory
;output file is strings.en-NZ.resources, in this directory
resgen strings.en-NZ.txtResgen 实用工具可以将资源文件转换回文本文件。但请注意,这样转换时将丢失所有注释(生成 .resources 文件时已将注释作为不必要信息去除)。如果您确实要这样进行转换,必须为 Resgen 提供输出文件的名称;如果仅指定输入文件,它将不工作。 Resgen 还可以将信息与另一种中间格式(称为 ResX)相互转换。ResX 格式是一种基于 XML 的格式,它将您放入 .txt 文件的名称-值对封装到 XML 指令中。与 .txt 文件相比,.ResX 文件所提供的优越性是,只要该对象是可序列化的,您就可将对象结构存储在 ResX 文件内。记住资源可以包含字符串信息,但是,它们也可以包含对象(如果对于资源识别应用程序有意义的话)。您可能希望存储的对象类型包括字体或位图之类的实际图片图像(典型示例是能够根据所使用的区域性设置来显示特定国家/地区的国旗/区旗)。 与对 .txt 文件相同,Resgen 可用于将 .ResX 文件与资源文件相互转换。下面的示例展示将 ResX 转换为资源,并将资源转换回 .txt 或 .ResX。注意有了资源文件以后,其构造方式无关紧要:它既可以转换回 .ResX 文件也可以转换回 .txt 文件。此外,如果需要,.txt 文件和 .resx 文件彼此可直接相互转换。 ;from inside your app directory
;convert a .ResX file into a resources file
resgen strings.ResX;now, convert the resources file just made (strings.resources), back into a .txt file
;the second parameter is the output file. Note that the extensions of the files
;must be correct for resgen to function properly
resgen strings.resources strings.txt;now, convert the same strings.resources file back into a ResX file
;how the resources file was constructed does not matter.
resgen strings.resources strings.ResX;you can also convert .txt or .resx files to and from one another
resgen strings.txt strings.ResX
resgen strings.ResX strings.txt请注意,由于 ResX 文件可以包含嵌入对象而 .txt 文件不可以,因此如果您使用 Resgen 将 ResX 文件转换为 .txt 文件,而该 ResX 文件有嵌入对象(或如果将带有对象的资源文件转换为 .txt 文件),那么这些对象不能保留。而将对象的数据类型写入 .txt 文件(以便为您提供某种反馈)。Resgen 将通知您发生了错误,并且将正确创建所有字符串资源。

解决方案 »

  1.   

    To xxqqhh_nn (shuibian):你这样做就可以啊。运行完毕以后,应该在你生成的exe所在地目录下生成一个myskin.resources文件,这个就是你产生的资源文件。
      

  2.   

    TheAres(班门斧) :
    是吗?
    谢谢你的肯定:)
    我在调用的时候没有成功,所以怀疑是资源文件出的问题:(
    你有空可以帮我看看我的另一个问题吗?
    http://expert.csdn.net/Expert/topic/1596/1596785.xml?temp=.5082666
    感激不尽
      

  3.   

    zwztu() :
    你说的应该是这一篇吧:(
    看得我头晕呀,还是要谢谢你,谢谢
    http://chs.gotdotnet.com/quickstart/howto/doc/createresources.aspx
      

  4.   

    HOWTO中不是已经说的很详细很详细了吗?
      

  5.   

    晕呀:(
    如果我不在项目中添加图象文件,程序创造出来的myskin.resources文件为零字节。
    如果我在项目中添加图象文件,运行时就会抛出异常:
    “创建资源文件时出错:bottom_left.bmp”
    大家在帮看看。
    (或许你们不知道我很笨:()
    帮忙呀
      

  6.   

    收到你发来的邮件,已经知道为什么了。
    >> Image bottomleft = Image.FromFile ("bottomleft.bmp") ;
    这个文件不存在,存在的一个是button_left.bmp,所以根本找不到文件。你要把所有的图象拷贝到这个生成exe文件所在的目录下才可以。