Dotnet中嵌入资源(位图、图标或光标等)有两种方式,一是直接把资源文件加入到项目,作为嵌入资源,在代码中通过Assembly的GetManifestResourceStream方法获取资源的Stream。另一种方法是在项目中加入. resx资源文件,在资源文件中添加资源,由ResourceManager类统一管理其中的资源。

下面分别详述这两种方法

一、使用GetManifestResourceStream读取嵌入资源

1、加入资源文件

直接把要嵌入到程序集的资源文件加入到项目中,可以加在项目的根目录,可以加在项目的任何目录中。

2、设置资源文件的“BuildAction”属性

将嵌入资源文件的“BuildAction”属性设置为“Embedded Resource”

3、代码中使用嵌入资源

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

//获得正在运行类所在的名称空间

Type type = MethodBase.GetCurrentMethod().DeclaringType;

string _namespace = type.Namespace;

//获得当前运行的Assembly

Assembly _assembly = Assembly.GetExecutingAssembly();

//根据名称空间和文件名生成资源名称

string resourceName = _namespace + ".directory.BitmapManifest.bmp" ;

//根据资源名称从Assembly中获取此资源的Stream

Stream stream = _assembly.GetManifestResourceStream(resourceName);

Image myImage = Image.FromStream(stream);

注意资源名称的组成规则:

项目默认名称空间.资源在项目中所在目录.资源文件名

上面代码中BitmapManifest.bmp位图就在项目的directory目录下。如果资源文件直接在项目根目录,则为项目默认名称空间.资源文件名

再给一个xml资源的例子:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

//获得正在运行类所在的名称空间

Type type = MethodBase.GetCurrentMethod().DeclaringType;

string _namespace = type.Namespace;

//获得当前运行的Assembly

Assembly _assembly = Assembly.GetExecutingAssembly();

//根据名称空间和文件名生成资源名称

string resourceName = _namespace + ".XMLFileTest.xml" ;

//根据资源名称从Assembly中获取此资源的Stream

Stream stream = _assembly.GetManifestResourceStream(resourceName);

XmlDocument xmlDoc = null ;

xmlDoc = new XmlDocument();

xmlDoc.Load(stream);

二、使用. resx资源文件嵌入资源

1、新建资源文件

在项目中新建一个资源文件,资源文件以.resx为后缀,同时还会新建一个跟资源文件同名的Designer.cs文件。

其实资源文件最大的用处是用来做多语言版本的软件时保存不同语言的资源,比如不同语言的菜单文本,可以把不同语言的字符串放在同一个资源类型下的不同资源包中,程序运行时根据运行时系统的culture选择不同的包显示不同语言的字符串。

新建了资源文件后就能往资源文件中添加资源文件:


图1 .resx资源文件可嵌入的资源类型

资源中可以添加字符串、位图、图标、音频、文件等等的资源。

添加的资源都会被保存在项目的Resources文件夹中。

2、设置资源文件的“BuildAction”属性

Resources文件夹中的所有资源文件的“BuildAction”属性设置为“Embedded Resource”。

3、 资源存在方式

.resx资源文件管理的资源可以用两种存在形式,一种是以一般的文件形式存在于Resources文件夹中,另一个是经过Base64编码后嵌入到.resx资源文件中。


图2 .resx资源文件中资源存在方式

打开.resx资源文件,选择资源,在属性中Persistence属性决定资源的存在形式。资源的两种存在形式,在代码中调用都是一样的。

4、 代码中使用嵌入资源

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

//获得正在运行类所在的名称空间

Type type = MethodBase.GetCurrentMethod().DeclaringType;

string _namespace = type.Namespace;

//获取当前主程序集

Assembly currentAssembly = Assembly.GetExecutingAssembly();

//资源的根名称

string resourceRootName = _namespace + ".ResourceTest" ;

//实例化资源管理类

ResourceManager resourceManager = new ResourceManager(resourceRootName, currentAssembly);

//根据资源名获得资源对象

Icon myIcon = (Icon)resourceManager.GetObject( "IconTest" );

注意资源的根名称的规则:

资源的根名称就是这个资源文件类的全名称。

打开.resx资源文件相应的Designer.cs文件能看到资源类的全名称:名称空间.资源类名。

资源名就是某个资源在.resx资源文件中的名称。

打开.resx资源文件可以看到各个资源的名称。上面图中图标文件IconTest.ico的名称是IconTest。

若要检索“字符串”资源,请调用 GetString 方法。

若要检索其他类型的资源,请调用 GetObject 方法,并将得到的资源显式转换成对应的类型。

5、多语言的资源应用

1

2

3

4

5

//得到当前语言环境

CultureInfo ci = Thread.CurrentThread.CurrentCulture;

//CultureInfo ci = System.Globalization.CultureInfo.CurrentCulture;

Icon myIcon = (Icon)resourceManager.GetObject( "IconText" , ci);

Dotnet中嵌入资源(位图、图标或光标等)有两种方式,一是直接把资源文件加入到项目,作为嵌入资源,在代码中通过Assembly的GetManifestResourceStream方法获取资源的Stream。另一种方法是在项目中加入. resx资源文件,在资源文件中添加资源,由ResourceManager类统一管理其中的资源。下面分别详述这两种方法一、使用GetManifestResourceStream读取嵌入资源1、加入资源文件直接把要嵌入到程序集的资源文件加入到项目中,可以加在项目的
1. 右键点击项目,选择 源,然后选择 源的类型,插入 源。 2. 这时候在项目的目录树上会出现一个 Resource 的文件夹,找到 嵌入 源文件 ,右击属性,在Build Action属性,将类型改为Embedded Resource ,然后保存。 3. 编辑 读取 源的代码 System.Reflection.Assembly assembly = System.Reflection.A...
示例代码: // 使用 源来获取当前工具的图标, 源名称为“项目名称.图标文件名” string localNameSpace = this.GetType().Namespace;//获取工作空间 Console.WriteLine(localNameSpace);//打印当前工作空间 //返回程序集中所有 源的名称 ,一般为:项目工作空间(项目名称)+“.”+“文件名” string[] names = System.Reflection.Assembly.GetExecutingAssembly().G
通过Get Manifest Resource Stream 加载文件出现错误提示“null值”对于“ stream ”无效。 在做Mobile开发时,需要引入图片,用到了这个 方法 : private Bitmap BackgroundImg = new Bitmap(System.Reflection.Assembly.GetExecutingAssembly().Get Manifest Resour
重载、重写、覆写,分别指的是overload、override、new。 一、override重写,是在子类中重写父类中的 方法 ,两个函数的函数特征(函数名、参数类型与个数)相同。用于扩展或修改继承的 方法 、属性、索引器或事件的抽象或虚拟实现。提供从基类继承的成员的新实现,而通过override声明重写的 方法 称为基 方法 。 注意事项: 1.重写基 方法 必须具有与override 方法 相同的签名。 2.override声明不能更改virtual 方法 的可访问性,且override 方法 与virtual 方法 必须具有相同级别
C# 中常涉及到对用户密码的加密于解密的算法,其中 使用 MD5加密是最常见的的实现方式。本文总结了通用的算法并结合了自己的一点小经验,分享给大家。 一. 使用 16位、32位、64位MD5 方法 对用户名加密 1)16位的MD5加密
在我们的编程中,我们有时候会想让我们的程序窗体固定大小,而该大小是我们在编辑时的大小。 经过我的摸索,和查阅 料。找到了一个 方法 。其实也很简单。其实也就是先找到该窗体的物理大小。 然后设置固定窗体的大小即可,核心代码如下: loginDialog::loginDialog(QWidget*parent): QDialog(parent), ui(new Ui::loginDialog) ui->setupUi(this); intwidth...
1 线程池的概念 许多应用程序 使用 多个线程,但这些线程经常在休眠状态中耗费大量的时间来等待事件发生。其他线程可能进入休眠状态,并且仅定期被唤醒以轮询更改或更新状态信息,然后再次进入休眠状态。为了简化对这些线程的管理,.NET框架为每一个进程提供了一个线程池,使应用程序能够根据需要来有效地利用多个线程。一个线程监视排到线程池的若干个等待操作的状态。当一个等待操作完成时,线程池中的一个辅助线程就会执行对应的回调函数。线程池中的线程由系统进行管理,程序员不需要费力于线程管理,可以集中精力处理应用程序任务。
C# 读取 和修改properties文件可以 使用 System.Configuration和System.IO命名空间。 首先,需要添加对System.Configuration和System.IO命名空间的引用: ```csharp using System.Configuration; using System.IO; 然后,可以 使用 ConfigurationManager类 读取 properties文件: ```csharp var appSettings = ConfigurationManager.AppSettings; string value = appSettings["key"]; 其中,key是properties文件中的属性名,value是属性值。 要修改properties文件,可以 使用 Configuration类: ```csharp var configFile = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); configFile.AppSettings.Settings.Add("newkey", "newvalue"); configFile.Save(ConfigurationSaveMode.Modified); ConfigurationManager.RefreshSection("appSettings"); 其中,newkey和newvalue是要添加的属性名和属性值,保存修改后需要调用Save 方法 ,刷新配置文件需要调用RefreshSection 方法