首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我们能跳过ResourceManager吗?

我们能跳过ResourceManager吗?
EN

Stack Overflow用户
提问于 2014-05-12 03:48:51
回答 4查看 777关注 0票数 6

我曾经在一个项目中广泛使用ResourceManager,这个问题就出现在我的脑海中。我们可以在不使用ResourceManager的情况下读取.resx文件吗?我是说,还有别的办法吗?

EN

回答 4

Stack Overflow用户

发布于 2014-05-12 04:33:53

ResourceManager是一个方便的类,它与构建系统支持.resx文件的方式一起工作得很好。不,这不是严格的必需品。

.NET程序集具有将任意数据嵌入到程序集清单中的一般功能。只是一个字节的blob,它可以是你想要的任何东西。构建系统也直接支持,只需在项目中添加一个文件并将其构建操作设置为"Embedded Resource“即可。在运行时,使用Assembly.GetManifestResourceStream()检索该文件中的数据。

你可以停在这里,但这只是一个单一的文件,如果你有许多小的资源想要嵌入,它的伸缩性不是很好。它是一个包含友好格式资源的.resx文件。当原始文件丢失时,它会给你一个重新找回来源的战斗机会。

但是对于资源数据来说,XML格式并不是一种很好的格式,它很庞大,而且重新查找数据的成本很高。因此,.NET提供了resgen.exe,这是一个构建工具,可以将XML文件转换为二进制文件,即.resources文件。紧凑,很容易找回来的东西。并且适合作为单个清单资源直接嵌入。

您不想做的是必须自己读取.resources数据。您将希望使用一个helper类,它可以从字节的blob中找到特定的资源。如果您想使用ResourceReader class,它的GetResourceData()允许您指定资源名称,它将返回资源类型和数据。

你可以到此为止,但是一个应用程序通常需要不同的资源集。一个非常常见的本地化需求。这就是附属程序集的全部内容,不同的程序集只包含资源,每个程序集对应于特定的区域性。它们是分开的,所以当您只需要一组本地化资源时,您不需要为存储所有本地化资源所需的虚拟内存付费。这里需要的是一个帮助器类,它可以根据当前区域性自动定位和加载正确的附属程序集,并为您检索资源。

那个帮助器类是ResourceManager

票数 16
EN

Stack Overflow用户

发布于 2014-05-12 04:17:33

如果您选择跳过ResourceManager的使用,您可以让Visual Studio为您处理代码生成。最终,生成的代码使用ResourceManager,但您不再需要手动编写该代码。此外,由于引用的是生成的静态类,因此可以进行编译时检查。

如果将资源文件添加到项目中并从解决方案资源管理器中双击它,Visual Studio将显示一个对话框,您可以在其中输入资源的名称及其值。该对话框为您提供了添加字符串、图像、音频等资源的选项(请查看对话框顶部的下拉列表)。接下来,要获得代码生成位,需要将Access Modifier设置为“公共”或“内部”。第三个选项是“不生成代码”。

例如,添加一个名为"MyResources“的资源文件,然后添加一个名称为Greeting、值为Hello!的字符串资源,并选择前两个选项之一进行代码生成(从public开始测试,根据需要限制访问),现在您应该能够通过MyResources.Greeting从代码中引用资源了。如果您没有立即看到它,请确保您已经保存了该文件并尝试编译。

代码语言:javascript
复制
string greeting = MyResources.Greeting; // "Hello!"

如果添加其他资源类型(图像、音频等)当然,返回类型也会有所不同。

此时,您可以检查生成的.cs文件,并看到生成的代码正在使用ResourceManager。资源文件的另一个用途是本地化。假设您想要一个西班牙语版本的MyResources。您将添加一个名为MyResources.es.resx的新文件,其中es对应于所需的语言代码(本例中为西班牙语)。现在添加具有西班牙语值Hola!的相同资源名称Greeting

如果将线程区域性更改为西班牙语,则引用该资源现在将返回西班牙语版本:

代码语言:javascript
复制
string defaultGreeting = MyResources.Greeting; // "Hello!"
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("es");
string spanishGreeting = MyResources.Greeting; // "Hola!"

请注意,您只需要将访问修饰符设置为默认资源文件(即MyResources.resx)的代码生成选项之一,而不是为您添加的所有其他本地化版本设置。这样做没有坏处,但在我看来,生成主文件而其他文件只有所需的资源值而不生成代码会更干净。

票数 7
EN

Stack Overflow用户

发布于 2014-05-12 04:13:53

好的,资源被编译到程序集中。您可以尝试通过读取字节(或IL)来读取程序集,并从中提取资源。

ResourceManager为你做了这一切,所以我想不出你有什么理由要这样做……也许有一个,如果你不想在内存中加载程序集,你可以不使用ResourceManager。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23597154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档