`

关于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.GetType().Assembly);

分享到:
评论

相关推荐

    C#资源文件操作的总结

    在这里,我来总结一下关于资源文件的相关操作。 //1.比较常见的有获取资源文件对应的文件流,然后转换到相对应的文件 //比较典型的做法是通过代码程序集加载指定资源 //如下通过Assembly的静态方法...

    C#微软培训资料

    17.4 异步文件操作 .227 17.5 小 结 .234 第十八章 高 级 话 题 .235 18.1 注册表编程 .235 18.2 在 C #代码中调用 C++和 VB 编写的组件 .240 18.3 版 本 控 制 .249 18.4 代 码 优 化 .252 18.5 小 ...

    C#实训教程

    6.2 运算符的简化操作 102 6.3 类型的安全性 107 6.4 类型转换 108 6.5 装箱和拆箱 111 6.6 对象的相等比较 112 6.7 引用类型的相等比较 112 6.8 运算符重载 114 6.9 运算符的工作方式 114 6.10 用户定义的数据类型...

    C#中使用资源的方法分析

    这里总结一个在C#中如何使用资源的方法如下: 方法一、使用本地文件 1、将本地要加入的资源文本(视频,图片,文本或其它)加入项目,比如我们现在加入一个up.bmp的图片到项目中,且放在文件夹Resources下面 2、将up.bmp...

    OA 管理系统 OAPro (C#源码)

    文件管理:接收文件 传送文件 文件操作记录 共享下载:查看共享 上传共享 管理共享 消息管理:接收消息 发送消息 部门群发 发送记录 我的群组 公文流转:接收公文 发送公文 发送记录 通知管理:查看通知 发布通知 通知...

    ASP.NET(C#)三层架构开源OA办公系统MSSQL商业版

    文件管理:接收文件 传送文件 文件操作记录 共享下载:查看共享 上传共享 管理共享 消息管理:接收消息 发送消息 部门群发 发送记录 我的群组 公文流转:接收公文 发送公文 发送记录 通知管理:查看通知 发布通知 通知...

    专业OA办公系统源码

    文件管理:接收文件 传送文件 文件操作记录 共享下载:查看共享 上传共享 管理共享 消息管理:接收消息 发送消息 部门群发 发送记录 我的群组 公文流转:接收公文 发送公文 发送记录 通知管理:查看通知 发布通知 通知...

    C#操作XML通用方法汇总

    在.net的项目开发中,经常会对XML文件进行操作,由于XML文件可以实现跨平台传输,较多的应用在数据传输中,特总结以下几种常用的XML操作方法: 1.创建XML文档: /// /// 创建XML文档 /// /// 根节点名称 ///...

    OA办公系统源码

    文件管理:接收文件 传送文件 文件操作记录 共享下载:查看共享 上传共享 管理共享 消息管理:接收消息 发送消息 部门群发 发送记录 我的群组 公文流转:接收公文 发送公文 发送记录 通知管理:查看通知 发布通知 通知...

    C#线程同步的几种方法总结

    或者你的程序需要访问一些外部资源如数据库或网络文件等。这些情况你都可以创建一个子线程去处理,然而,多线程不可避免地会带来一个问题,就是线程同步的问题。如果这个问题处理不好,我们就会得到一些非预期的结果...

    OA办公系统

    文件管理:接收文件 传送文件 文件操作记录 共享下载:查看共享 上传共享 管理共享 消息管理:接收消息 发送消息 部门群发 发送记录 我的群组 公文流转:接收公文 发送公文 发送记录 通知管理:查看通知 发布通知 通知...

    [14本经典Android开发教程]-8-Linux内核阅读心得体会

    读核感悟 文件操作 AIO操作的执行 66 1 在提交时执行AIO 66 2 在工作队列中执行AIO 66 3 负责AIO执行的核心函数aio run iocb 67 4 AIO操作的完成 67 读核感悟 文件读写 内核态是否支持非direct I O方式的AIO ...

    专业OA办公系统源码 开发工具:Visual Studio .NET 2005 + Server2005

    文件管理:接收文件 传送文件 文件操作记录 共享下载:查看共享 上传共享 管理共享 消息管理:接收消息 发送消息 部门群发 发送记录 我的群组 公文流转:接收公文 发送公文 发送记录 通知管理:查看通知 发布通知 通知...

    Visual Studio.Net(VS) 源码管理器

    五、 版本控制的几个概念在Visual Studio.Net开发环境"解决方案资源管理器"的上下文菜单或者"文件"——中有如下与文件操作有关的命令,如图十三所示: 1、 文件的"签出"(Check Out):当需要编辑一个文件时,必须...

    计算机应用基础知识点总结.doc

    13、应用软件分类〔软件名称自己总结 办公应用 平面设计 视频编辑与后期制作 网站开发 辅助设计 三维制作 多媒体开发 程序设计 14、相关定义 操作系统是最基本最重要的系统软件,用来管理和控制计算机系统中硬件和...

    SharpML:机器学习网络共享密码搜寻工具包

    该模型已使用PyInstaller进行编译,并作为资源文件位于C#包装器中,该包装器在自身,数据和模型之间互操作。 程序逻辑如下所示: 当前,它允许评估单个文件共享。 您将需要对要定位的文件共享具有读取权限,此后...

    asp.net知识库

    在MastPage中引用脚本资源 2.0正式版中callback的一些变化+使用示例(ASP.NET 2.0) asp.net 2.0 新特性 Visual Web Development 2005开发ASP.NET使用小技巧 ASP.NET 2.0 异步页面原理浅析 [1] [原] 自定义通用...

    vc++ 应用源码包_1

    内含远程控制、进程管理、文件操作、视频控制、注册表操作、客户端服务器端。 redui_src_v0.9.130(DirectUI 3D) DirectUI 3D界面库。 sdk(界面库) RINGSDK包含界面库和图象库。 绘MFC基本控件 PlayerDrectShow...

Global site tag (gtag.js) - Google Analytics