技术开发 频道

C#:浅谈程序集清单资源和RESX资源

  【IT168技术】程序集清单资源:在程序集中嵌入资源的最简单方法是什么?那就是使用Visual Studio中的“嵌入式资源(Embedded Resource)”创建选项,相当于使用csc的”/resource”参数。具体步骤,首先在Visual Studio的工程中选择资源文件,然后选择“属性”,接着在属性框中的Build Action中选择Embedded Resource,如下图,把a.file作为资源文件。

C#:浅谈程序集清单资源和RESX资源

  这个a.file成为嵌入资源后,它将会作为清单资源(Manifest Resource)存入程序集清单中(Assembly Manifest):

C#:浅谈程序集清单资源和RESX资源

  程序集清单是程序集不可缺少的元素,上图来自MSDN,可以参考更多关于程序集或者程序集清单的信息在这里:http://msdn.microsoft.com/zh-cn/library/1w45z383(v=VS.100).aspx,本文就不再多说了。

  接下来要关心的是怎样使用程序集清单中的资源。

  我们可以使用Assembly类的GetManifestResourceNames方法,返回程序集的所有清单资源的文件名。

  或者Assembly.GetMenifestResourceStream方法返回指定资源的流。

  比如刚才那个包含a.file的程序集。

    var ass = Assembly.GetExecutingAssembly();
       
foreach(var file in ass.GetManifestResourceNames())
        Console.WriteLine(file);

   输出

Mgen.a.file

   前面的Mgen是程序集的默认命名空间,VS在编译后会自动把命名空间加在文件名的前面的。

  接下来使用GetManifestResourceStream来读取文件内容:

   var ass = Assembly.GetExecutingAssembly();
    
var stream = ass.GetManifestResourceStream("Mgen.a.file");
     
/* 操作Stream对象来读取文件信息 */

   RESX资源文件

  另外一种创建资源的形式就是RESX资源文件,这个通过VS的添加文件中的“资源文件”类型。RESX文件相比手动创建上面讲的程序集清单资源最大的优势就是:

  支持多语言

  快速创建资源

  管理方便

  RESX可以支持多语言,Visual Studio编译后会出现附属程序集(satellite assembly),事实上是连接器(AL.exe)做这份工作。程序在执行在不同语言环境会搜索相应语言的资源。同时Visual Studio还提供了强大的RESX的资源编辑器。

  同程序集清单资源一样,我们还是要弄懂所谓RESX资源到底是怎么存的。

  现在,在工程中创建一个Resource1.resx,编辑它,添加一个b.file文件,再添加一个字符串,随便写个名称。

  完成后,你会发现工程里多了些文件:

C#:浅谈程序集清单资源和RESX资源

  a.file是上面我们手动加的程序集清单资源。而Resource1.resx中的文件被存到了一个叫Resources的文件夹内(图中的b.file)。

  检查这两个文件的属性中的Build Action,你会发现,Resources内的文件的Build Action都是None,VS不会对他们进行任何操作的,就好像他们不在工程里似的。而RESX文件的Build Action则是Embedded Resource,它会成为程序员清单资源,不同于不同程序集清单资源,RESX在编译时下面的Custom Tool是一个叫ResXFileCodeGenerator的工具:

C#:浅谈程序集清单资源和RESX资源

  这个工具会把所有RESX的资源连起来创建成一个二进制文件,VS最后把这个生成的文件最终作为程序集清单资源文件保存到程序集中。这个二进制资源文件的扩展名是.resources。

  此时再运行上面讲的Assembly.GetManifestResourceNames方法来枚举程序集清单资源文件,输出会成:

Mgen.a.file
Mgen.Resource1.resources

  Resource1.resx文件会最终编译成Mgen.Resource1.resources资源文件。

  整个过程可以看这张图:

C#:浅谈程序集清单资源和RESX资源

1
相关文章