C#资源文件操作的总结

/在这里,我来总结一下关于资源文件的相关操作。

//1.比较常见的有获取资源文件对应的文件流,然后转换到相对应的文件

//比较典型的做法是通过代码程序集加载指定资源

//如下通过Assembly的静态方法GetExecutingAssembly()得到程序集

//还有很多方式可以得到代码程序集

System.Reflection.Assembly asm = System.Reflection.Assembly.GetExecutingAssembly();

Stream manifestResourceStream = null;

manifestResourceStream = asm.GetManifestResourceStream("MyLibrary." + filename);

return manifestResourceStream;

//得到该文件流,这里也可以是字符流。

//如果我们资源文件对应的该清单是一个图片文件

System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(manifestResourceStream, true);

//如果我们的资源文件是光标文件

Cursor cursor = new Cursor(manifestResourceStream);

//图标

Icon icon = new Icon(manifestResourceStream);

//字符串

System.IO.StreamReader sr = new System.IO.StreamReader(manifestResourceStream);

string str = sr.ReadLine();

//2.另外一种写法,主要是通过ResourceManager类的GetObject()方法

//也可以通过GetStream()得到流后执行操作.

System.Resources.ResourceManager manager =

new System.Resources.ResourceManager("资源名称", Assembly.GetExecutingAssembly());

Object target = manager.GetObject("资源文件名");//获取到指定的资源的值

//在这里对应我们加入到资源文件的清单,

//转换回我没的目标值,可能会产生一个拆箱的过程

//如果我们资源文件对应的该清单是一个图片文件System.Drawing.Bitmap bitmap = (System.Drawing.Bitmap)target;

//如果我们的资源文件是光标文件

Cursor cursor = (Cursor)target;

//图标

Icon icon = (Icon)target;

//字符串

string str = target.ToString();//或者manager

manager.GetString("资源文件名");

//通过以上两种操作,就可以从资源文件中进行一个指定资源的加载了。

//前提是你的资源清单理存在该资源哦。

//推荐使用第种方法,这种方法也是MS Resx里对资源文件的操作方法。

//现在我们已经可以读取资源文件了,现在开始写资源文件的操作。

//3.当然,你可以直接通过设计界面来添加一个资源文件,

//切记将生成操作改为“嵌入的资源”,Embed

System.Resources.ResourceWriter writer =

new System.Resources.ResourceWriter("dongpad.com.resources");

writer.AddResource("bitmap", Image.FromFile(@"dongpad.bitmap"));

writer.AddResource("cursor", Image.FromFile(@"dongpad.cursor"));

writer.AddResource("ico", Image.FromFile(@"dongpad.ico"));

writer.AddResource("str", Image.FromFile(@"dongpad.str"));

//在这里资源的名称记得要唯一。

writer.Generate();

writer.Close();

//下次給大家总结一下关于C#开发中常用的一些重写。希望大家支持!

--参考文献-------------------------------------------------------------------------- 

 什么是资源文件
   在 .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.GetTy

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值