注意:

这是另一篇文章“.NET(C#):浅谈程序集清单资源和RESX资源”的一部分。

ResourceManager类型在System.Resources命名空间内,用来在运行时刻进行二进制程序集清单资源 (.resources文件)的读取,其也支持外部文件形式的读取。它和其他资源读取类:ResourceSet和IResourceReader的区别 是它的功能是最强大的(内部会使用一个ResourceSet),因为不因能够像ResourceSet一样快速读取资源数据,它可以对.NET中程序集 的附属程序集(satellite assembly)进行探索,因此支持资源数据的多文化读取。

 

下面是ResourceManager的常用成员:

//System.Resources命名空间内

//在运行时刻读取.resources二进制资源文件

//支持多语言探索

classResourceManager

//方法

    构造函数(string baseName, Assembly ass);

    //在程序集(ass参数)中查询baseName.resources文件

    //有其他重载具有Type参数,来制定一个自定义的ResourceSet类型,默认使用ResourceSet类

    构造函数(Type);

    //BaseName = Type.Name, 内部程序集 = Type.Assembly

 

    staticResourceManager CreateFileBasedResourceManager(string baseName, string folder, Type customResSet);

    //(注意静态)从文件中创建一个ResourceManager类型

 

    //从资源中读取数据

    object GetObject(string, CultureInfo);

    UnmanagedMemoryStream GetStream(string, CultureInfo);

    string GetString(string, CultureInfo);

 

    ResourceSet GetResourceSet(CultureInfo, bool, bool);

    //获取ResourceSet对象,可以指定加载选项和文化不存在使用父文化

    void ReleaseAllResources();

    //关闭内部ResourceSet

//属性

    BaseName: string;

    //可以在构造函数中设置。

    //如果资源文件名是aaa.en-us.resources,那BaseName是aaa

    IgnoreCase: bool;

    //数据查询中不区分大小写

 

 

下面代码使用IResourceWriter先写入一个二进制资源文件(a.resources),然后用ResourceManager读取文件 数据,注意从文件创建ResourceManager使用CreateFileBasedResourceManager,其中文件名称仍然按照 ResourceManager.BaseName属性,比如a.resources文件,名称就是a变可以了。

(关于IResourceReader或者IResourceWriter,可以参考这篇文章:.NET(C#):使用IResourceReader,IResourceWriter和ResourceSet):

//+ using System.Resources

classProgram

{

    staticvoid Main()

    {

        //使用IResourceWriter

        Write();

        //使用ResourceManager读取

        ReadUsingResourceManager();

    }

 

    //使用IResourceWriter

    staticvoid Write()

    {

        using (IResourceWriter rw =newResourceWriter("a.resources"))

        {

            rw.AddResource("byte", (byte)0xff);

            rw.AddResource("文本", "hellow");

            rw.AddResource("guid", Guid.NewGuid());

        }

    }

    //使用ResourceManager读取

    staticvoid ReadUsingResourceManager()

    {

        var resMgr =ResourceManager.CreateFileBasedResourceManager("a", Directory.GetCurrentDirectory(), null);

 

        Console.WriteLine((byte)resMgr.GetObject("byte"));

        Console.WriteLine(resMgr.GetString("文本"));

        Console.WriteLine((Guid)resMgr.GetObject("guid"));

    }

}

 

输出:

255

hellow

cf042fc6-ae74-42c0-935c-ed962412bbb0