使用资源文件

[WPF多语言/本地化]通过.resx资源文件实现 通过Win32的API接口,修改MessageBox,使得其支持多语言。MessageBox 按钮显示英文或其他语言_message box怎么设置英文-CSDN博客。 阅读详情
如何使用资源文件

摘要
.NET 中有一套非常完善的地方化系统被定义在 System.Resources 名字空间中。不过大多数人都被 MissingManifestResourceException 这个错误困惑着。本文就是要让大家了解什么是资源文件,它有什么用处以及如何正确的调用从而避免一些"奇怪"的错误,包括 MissingManifestResourceException 这个常见错误。

目录
本文来源以及最终目的
什么是资源文件
资源文件类型
调用资源文件的几种方法
如何准确的定义资源文件的逻辑位置
推荐工具
总结
参考信息
关于作者

本文来源以及最终目的
最近作者在新闻组中看到许多有关资源文件的问题,而大多数人都有 MissingManifestResourceException 这个非常时髦的错误。所以作者考虑了一下,决定不想再让更多的人把时间都浪费在这个问题上了。这就是这篇文章的诞生原因。而最终目的除了让这个问题在新闻组上消失之外还要让大家在 10 分钟内彻底掌握资源的调用,从而成为真正的资源高手!:)

什么是资源文件
在 .NET 中准备 World-Ready 程序时需要三步,Globalization,Localizability 和 Localization。在这第三步的 Localization 中就是使用资源文件最常见的地方。(本文不讨论 World-Ready 程序,或许以后在另一篇文章中)因为程序的逻辑界面需要与资源界面隔离,而资源界面就是我们所说的资源文件。顾名思义,一个资源文件中当然全是资源,不过,什么是资源?这里所谓的资源就是程序中可利用的数据,譬如:字符串、图片和任何二进制数据,包括任何类型的文件。注意一个资源文件可以有多种语言版本,举例,一个 Strings.resources 文件可以有英语版、简体中文版、繁体中文版等。 ResourceManager 可以自动根据文件名来确认调用哪个版本。不同的版本只要在文件名中添入区域语言就可以了。比如,我们的 Strings.resources 是默认版,英语版的可以是 Strings.en-US.resources(美国英文),简体中文的可以是 Strings.zh-CHS.resources(简体中文),而繁体中文的就可以是 Strings.zh-CHT.resources(繁体中文)。所谓的默认版就是当找不到适当的资源版本时用的资源,一般都是英文。默认文件应当被嵌入到主 Assembly 中,这样就不会发生找不到资源的错误。在 VS.NET 中将一个文件的属性设为 Embedded Resource 可以使资源被嵌入到主 Assembly 中。

资源文件类型
System.Resources 名字空间支持三种资源文件:
.txt 文件,只能有字符串资源。因为不能被嵌入到 Assembly 中,所以很容易暴露,被客户修改。最大缺点是仅支持字符串资源,所以不推荐使用。
.resx 文件,由 XML 组成,可以加入任何资源,包括二进制。同样不能被嵌入到 Assembly 中。在 System.Resources 名字空间中有专用读写的类。VS.NET 创建这种文件然后将其转成 .resources 文件并根据设置将其嵌入到 Assembly 中。
.resources 文件,PE 格式,可以加入任何资源。唯一可以被嵌入到 Assembly 的文件,在 System.Resources 名字空间中有专用读写的类。

调用资源文件的几种方法
ResourceManager 可以根据不同的 UICulture 设置返回不同的本地资源(这与 World-Ready 程序有关,在此不讨论),我们只需知道调用资源用到它就可以了。接下来让我们看看如何调用每一种:
.txt 文件:
不可以直接调用,得先将其转换成 .resources 文件才能使用。(关于如何转换请看"推荐工具")
.resx 文件:
可以用 ResXResourceReader 来做读取,但是这种方法不直观,不推荐直接调用 .resx 文件。正确的方法是将其转换成 .resources 文件,然后用 ResourceManager 作读取工作。注意如果是在 VS.NET 中添加的 .resx 文件,那么它们自动被设为 Embedded Resource,转成 .resources 文件后被嵌入到 Assembly 中。
.resources 文件:
分成两种情况:
被嵌入或编译成 Satellite Assembly:
用 ResourceManager 的各种 constructor 来获得在 Assembly 中的资源。
单独文件,没被编译或嵌入到 Assembly 中:
可以用 ResourceManager.CreateFileBasedResourceManager 来获得资源集(ResourceSet),就是所有的资源。
特殊情况:
还有一种特殊情况,那就是当你直接嵌入一资源时,也就是说,不通过一个资源文件而直接将一资源嵌入到 Assembly 中。这可以在 VS.NET 中通过设置一文件的 Build 属性为 Embedded Resource 实现。在这种情况下 ResourceManager 就没有用了,因为它只能获取 .resources 资源文件(在或不在 Assembly 中)。那么如何调用这类的资源呢?不难,我们需要利用一些 Reflection 中的特征。别怕,不是让你再学 Reflection,其实我们只要了解一些 System.Reflection.Assembly 这个类中的一些函数就可以了。有三个相关函数,不过我们只需要 Assembly.GetManifestResourceStream 这个函数。这个函数将一嵌入到 Assembly 中的资源以 stream 的方式返回,而我们可以将这个 stream 转成在 .NET 中可用的对象。比如,如果嵌入资源是一图片,那么我们可以利用 New Bitmap(Stream) 这个 Bitmap 的 constructor 获得这个图片资源的 Bitmap 对象。
注:在这里仅介绍怎样获得不同的资源的方法,关于怎样用各个类与函数请参看有关文档。

如何准确的定义资源文件的逻辑位置
我想这是许多人最关注的一段了!在这里作者将解说如何正确的填写 ResouceManager(String, Assembly) 这个 constructor,还有如何正确的填写 Assembly.GetManifestResourceStream(String),因为它们两个的原理是相同的。看过了上面的描述,到了这里就简单多了。这里主要讨论的是怎么填写那个 String。这个 String 就是资源的完整名,一个完整名由它的名字空间和文件名前部分(BaseName)组成。例如,如果默认名字空间(root namespace)是 DefaultNamespace,资源文件的名字是 Strings.en-US.resources,那么它的完整名就是 DefaultNamespace.Strings。这个很简单,不过怎样确定名字空间呢?这就有些奇怪了,因为 C# 的编译器与 VB.NET 的编译器有些不同。作者在这里分别给出两个编译器怎样给嵌入资源自动添加命名空间:
C#
它自动添加 default namespace(与 root namespace 相同),但也添加子文件夹的名字。例如,在 Subfolder 子文件夹下放的资源文件 Strings.en-US.resources,它的完整名是 default namespace + subfolder + base name = DefaultNamespace.Subfolder.Strings
VB.NET
在 VB.NET 中就很简单了,它自动给嵌入资源添加 root namespace。不管你在哪个子文件夹中放置资源文件,资源文件的完整名永远是 root namespace + base name。
根据上面的描述,如果我们使用 C#,用 VS.NET 在 NewFolder 这个子文件夹中添加了一个叫 Images.resources 的资源文件,那么我们应该用以下代码获取这些资源,假设 default namespace 是 MyDefault:
ResourceManager res = new ResourceManager("MyDefault.NewFolder.Images", this.GetType().Assembly);
但如果我们用 VB.NET 的话,就应该这样:
Dim res As New ResourceManager("MyDefault.Images", Me.GetType().Assembly)

推荐工具
resgen.exe:SDK 中的工具,专门用来做资源文件类型之间的转换。支持 .txt <-> .resx <-> .resources 之间的转换。
Resourcer:专门用来创建资源文件,简单易用,支持 .resx 与 .resources 文件格式。(http://www.aisto.com/roeder/dotnet)
.NET Reflector:用来浏览 Assembly。如果你不确定一个资源文件的完整名时可以用这个工具在 Assembly 中查看。(http://www.aisto.com/roeder/dotnet)

总结
本文中谈及了以下内容:
什么是资源
什么是资源文件
.NET 中有哪几类资源文件
如何定义资源文件的逻辑位置
调用资源文件的几种方法
本文通过正确定位资源文件而解决了那个非常时髦的 MissingManifestResourceException。本文给了您一个很丰富资源调用经验。想让您完全了解有关资源文件的任何可能问题,当然也会有漏洞。如果有的话希望大家谅解!

参考信息
以下是一些文档的链接,如果您的帮助是中文的话请在 MSDNVS 后添加".2052":
Resource File Generator (Resgen.exe)
ms-help://MS.VSCC/MS.MSDNVS/cptools/html/cpgrfresourcefilegeneratorutilityresgenexe.htm
Resources in Applications
ms-help://MS.VSCC/MS.MSDNVS/cpguide/html/cpconcreatingusingresources.htm
Resource Fallback Process
ms-help://MS.VSCC/MS.MSDNVS/cpguide/html/cpconpackagingdeployingresources.htm #cpconpackagingdeployingresourcesanchor1

C# 利用resx文件实现多语言的Winform窗体 本文使用resx文件实现Winform多语言切换,以实现简体中文、英文的切换为例。如果后续需要增加其它语言的切换,只需要按照步骤操作即可。 并且,当修改了语言之后,会更新主窗口的语言,后续打开窗口的语言与主窗口保持一致 阅读详情

相关推荐

C#【必备技能篇】Winform实现多语言切换(.resx文件的应用)

在实际的项目开发中,软件需要实现多语言切换。本文通过一个实际的例子,可以让你学习到这个技能。

星Yeah 的博客 1万+

.resx文件

.resx文件

crystal4000的博客 1414

在Qt Designer中创建自定义按钮控件并设置按钮图标及图标大小

然后,在右侧的Property Editor中,将按钮的Text属性设置为空,并将PushButton Style设置为Flat(这使得按钮不带有默认的3D效果)。本文将介绍如何在Qt Designer中创建一个继承自QAbstractButton的自定义按钮控件,并设置按钮的图标和图标大小。最后,在Qt Designer中切换到Edit模式,并在右侧的Property Editor中添加我们自定义的icon和iconSize属性。现在,我们需要在自定义按钮控件中添加两个属性:icon和iconSize。

. 3711

在dotnet中如何使用资源(转自MS中国社区)

如何使用资源文件 摘要 .NET 中有一套非常完善的地方化系统被定义在 System.Resources 名字空间中。不过大多数人都被 MissingManifestResourceException 这个错误困惑着。本文就是要让大家了解什么是资源文件,它有什么用处以及如何正确的调用从而避免一些"奇怪"的错误,包括 MissingManifestResourceException 这个常见错误

Sharper的技术人生 1440

按钮大小及图标设置

import javax.swing.ImageIcon; import java.awt.*; import java.awt.event.*; public class MainPanel extends JFrame { private JButton button_1; JPanel JP; private ImageIcon img_1=...

dawn_1108的博客 2293

MFC 给按钮加载图标,并指定图标大小的方法

用LoadImage函数 1、首先在资源管理器中增加图标资源(此处为IDI_ICON1),注意必须为ICON类型的文件; 2、增加一个按钮,按钮大小和图片大小一致(像素)。按钮关联控制变量m_btnPlay;       3、在初始化函数中增加加载处理。         HICON hIcon; hIcon = (HICON)LoadImage(AfxGetInstanceHandle

dafenqie的博客 7633

android 浮动小图标,android - 调整浮动动作按钮的图标大小(fab)

android - 调整浮动动作按钮的图标大小(fab)新的浮动操作按钮应为56dp x 56dp,其中的图标应为24dp x 24dp。 所以图标和按钮之间的空间应该是16dp。android:id="@+id/fab_add"android:layout_width="56dp"android:layout_height="56dp"android:layout_gravity="botto...

weixin_39763640的博客 1116

QT的按钮显示图标并无视图标比例铺满整个按钮控件大小

参考自https://blog.csdn.net/weixin_45079970/article/details/128004361提供左边的按钮背景图,我们需要实现右边的效果,并且背景随着按钮的大小自动变化:如果背景图和按钮一样大时使用 background-image 没有任何问题,但是当按钮和背景图不一样大时,背景图要么显示不全,要么重复平铺到按钮上,显然满足不了这里的需求。

weixin_39010374的博客 433

flutter图标按钮_如何在Flutter中调整图标/图标按钮的大小?

I have 2 questions.how to scale our icon ? I mean not a default icon from Flutter. but when you change into an Image. I have an Icon Button with an image like this:Row(mainAxisSize: MainAxisSize.max,c...

weixin_42322219的博客 2073

ElementPlus按钮设置图标并设置大小

ElementPlus按钮设置图标并设置大小

简单点的博客 2058

element饿了么按钮图标大小踩坑

话不多说直接上代码~~~~~~~~~ <template> <div id="app"> <el-button icon="el-icon-s-help"></el-button> </div> </template> <script> export default { name: "App", data() { return { text: "hello" };

weixin_42116924的博客 3276

修改android Toolbar的标题大小和按钮图标颜色

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34195546的博客 674

安卓java修改按钮大小_修改android Toolbar的标题大小和按钮图标颜色

使用android toolbar的时候,toolbar中的标题、二级标题以及按钮的图标的颜色都会使用默认的值。但是,有时候我们必须要自定义它们的大小以及颜色,该如何自定义呢?解决方法:(1)修改标题、二级标题的字体大小和颜色,可以通过style进行修改,然后在引用相对应的定义好的style样式。style样式,例如:16sp@android:color/white11sp@color/toolb...

weixin_29491259的博客 756

flutter图标按钮,如何在Flutter中调整图标/图标按钮的大小?

I have 2 questions.how to scale our icon ? I mean not a default icon from Flutter. but when you change into an Image. I have an Icon Button with an image like this:Row(mainAxisSize: MainAxisSize.max,c...

weixin_39686634的博客 1182

java自动设置按钮,自动调整大小的JButton图标

so I have this JButtons to which I add Icons. The Icons are too large initially, so I resize them beforehand, and it works fine. Except that when I resize the window, the JButtons change size, but not...

weixin_39626745的博客 254

Ant Design Blazor 中按钮图标大小不一致问题解决方案

使用 Ant Design Blazor 进行开发时,很多开发者会遇到按钮图标大小不一致的问题。这种问题通常表现为: - 不同尺寸按钮中的图标大小不协调 - 加载状态图标与普通图标大小不一致 - 圆形按钮和方形按钮图标显示异常 这些问题不仅影响用户体验,还会破坏界面的整体美观性。本文将深入分析问题原因,并提供完整的解决方案。 ## 问题根源分析 ### 1. 尺寸变量定义不一致 通过分...

gitblog_01416的博客 348

linux qt 按钮图标大小设置,Qt设置美观按钮

一、简述在上一篇Qt 之 去除窗口部件被选中后的焦点虚线框中,我们为了去除焦点虚线框,给按钮的样式加上了如下的样式。QPushButton{background:red;border:0px;}这样导致鼠标点击按钮之后没有按下凹陷的反馈感觉是没有点击上去似的。上面两个按钮加上了border:0px;去除了边框,点击之后没有凹陷的感觉,而后两个按钮没有加上border:0px;,保留了按钮原始的...

weixin_29044157的博客 1484

Winform SunnyUI主题窗体属性:图标,可变大小,标题栏扩展按钮

Winform SunnyUI主题窗体属性:图标,可变大小,标题栏扩展按钮 把窗体的AutoScaleMode从Font设置为None,否则可能出现因为屏幕分辨率而导致的窗体变形。 拖拽调整窗体大小 ShowDragStretch 设置为true,显示边框可拖拽调整窗体大小。 显示任务栏图标 设置Icon,将ShowIcon设置为true,再打开ShowTitleIcon可显示窗体标题栏图标。 显示标题栏扩展按钮 ExtendBox设置为true,可在标题栏现有按钮最小化按钮的左边显示一

集电极 6047
上一篇: .NET资源文件的创建、使用
下一篇: 使用资源文件(二)
andtom
博客等级 码龄22年 0粉丝 21原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值