我正在开展一个项目,我正在广泛使用ResourceManager,这个问题在我脑海中浮现.我们可以在不使用ResourceManager的情况下从.resx文件中读取吗?我的意思是,还有另一种方式吗?
Han*_*ant 16
ResourceManager是一个便利类,它与构建系统支持.resx文件的方式很好地协作.不,这不是一个严格的必要性.
.NET程序集具有将任意数据嵌入到程序集清单中的通用功能.只需一个字节,它可以是你想要的任何东西.也可以由构建系统直接支持,只需将一个文件添加到项目中,并将其Build Action设置为"Embedded Resource".在运行时,使用Assembly.GetManifestResourceStream()检索该文件中的数据.
你可以在那里停下来,但这只是一个文件,如果你想要嵌入许多小资源,它就不能很好地扩展.这是.resx文件启动的位置,它是一个XML文件,包含友好格式的资源.当原件丢失时,一个让你有机会再次恢复源头的机会.
但是XML格式对于资源数据来说不是一种非常好的格式,它很笨重,而且找回数据也很昂贵.所以.NET有resgen.exe,这是一个构建工具,可以将XML文件转换为二进制文件,即.resources文件.紧凑,易于找回的东西.并且适合作为单个清单资源直接嵌入.
什么,你不希望做的是不必自己阅读的.resources数据.您将需要使用可以从字节blob中找回特定资源的帮助程序类.您希望使用ResourceReader类,它GetResourceData()允许您指定资源名称,它将向后退出资源类型和数据.
你可以在那里停下来,但是应用程序通常需要不同的资源集.非常常见的本地化需求.这是卫星组件的全部内容,不同的组件只包含资源,每个组件都包含特定的文化.它们是分开的,因此当您只需要一组本地资源时,您不需要为存储所有本地化资源所需的虚拟内存付费.这里需要的是一个帮助程序类,它根据当前文化自动定位并加载正确的附属程序集并为您检索资源.
那个助手班是ResourceManager.
如果您选择跳过使用,ResourceManager可以让Visual Studio为您处理代码生成.最终生成的代码使用a ResourceManager,但您不再手动编写该代码.此外,您将获得编译时检查,因为您引用了生成的静态类.
如果将资源文件添加到项目中并从解决方案资源管理器中双击它,Visual Studio将为您提供一个对话框,您可以在其中输入资源的名称及其值.该对话框为您提供了添加资源的选项,如字符串,图像,音频等(请查看对话框顶部的下拉菜单).接下来,要获取代码生成位,您需要将其设置Access Modifier为"公共"或"内部".第三个选项是"无代码生成".
例如,添加一个名为"为MyResources"的资源文件,然后添加与字符串资源名称 Greeting和值的Hello!随着选择的代码生成前两个选项之一(与公众进行测试开始,限制访问的需要) ,您现在应该可以通过代码引用资源了MyResources.Greeting.如果您没有立即看到它,请确保您已保存文件并尝试编译.
string greeting = MyResources.Greeting; // "Hello!"
Run Code Online (Sandbox Code Playgroud)
如果添加其他资源类型(图像,音频等),则返回类型当然会有所不同.
此时,您可以检查生成的.cs文件,并查看生成的代码是否正在使用ResourceManager.资源文件的另一个用途是本地化.假设您想要一个西班牙语版本MyResources.您将添加一个名为的新文件MyResources.es.resx,其中es对应于所需的语言代码(在本例中为西班牙语).现在添加Greeting西班牙语值为的相同资源名称Hola!.
如果您将线程文化更改为西班牙语,则引用该资源现在将返回西班牙语版本:
string defaultGreeting = MyResources.Greeting; // "Hello!"
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("es");
string spanishGreeting = MyResources.Greeting; // "Hola!"
Run Code Online (Sandbox Code Playgroud)
请注意,您只需将访问修饰符设置为默认资源文件(即MyResources.resx)的代码生成选项之一,而不是您添加的所有其他本地化版本.这样做没有任何害处,但在我看来,生成主文件更加清晰,而其他人只需拥有所需的资源值而无需生成代码.
| 归档时间: |
|
| 查看次数: |
479 次 |
| 最近记录: |