.net從二進制資源中逆向出文件。

.NET(C#):使用IResourceReader,IResourceWriter和ResourceSet

注意: html

這是另外一篇文章「.NET(C#):淺談程序集清單資源和RESX資源」的一部分。 函數

全部說起類均在:System.Resources命名空間內。 ui

來看這三個類的經常使用成員: spa

interface IResourceWriterIDisposable orm

    void AddResource(string name, object/string/byte[]); htm

    //添加資源數據 對象

    void Generate(); blog

    //更新緩衝區(Flush) 繼承

    void Close(); ci

    //調用Dispose

 

 

interface IResourceReaderIDisposableIEnumerable

    IDictionaryEnumerator GetEnumerator();

    //獲取字典迭代器(用來枚舉資源)

    void Close();

    //調用Dispose

 

 

class ResourceSetIDisposableIEnumerable

//沒有CultureInfo支持,封裝一個IResourceReader

    構造函數(Stream/IResourceReader/string);

 

    Type GetDefaultReader/Writer();

    //返回默認IResourceReader/Writer類型

 

    IDictionaryEnumerator GetEnumerator();

    //等效於IResourceReader.GetEnumerator

 

    object GetObject(string);

    string GetString(string);

    //有bool參數:指定否是不區分大小寫

    //返回資源中指定名稱的數據

 

 

有兩個類繼承IResourceReader,分別是ResourceReader和ResxResourceReader。

IResourceWriter則爲ResourceWriter和ResxResourceWriter。

ResourceReader和ResourceWriter操做的是二進制的資源文件,以.resources爲擴展名。

ResxResourceReader和ResxResourceWriter操做的是XML格式的RESX文件(注意RESX在編譯後也用到.resources文件)

image

 

這些類的構造函數能夠指定字符串表示文件路徑或者Stream對象。

最後ResxResourceReader/Writer類型在System.Windows.Forms.dll類庫中。而ResourceReader/Writer在mscorlib.dll類庫中。

 

下面代碼,使用IResourceWriter來寫一個資源文件(用ResourceWriter類型,因此是.resources文件),而後用IResourceReader和ResourceSet來讀取資源文件:

//+ using System.Resources

class Program

{

    static void Main()

    {

        //使用IResourceWriter

        Write();

        //使用IResourceReader

        ReadUsingResourceReader();

        //使用ResourceSet

        ReadUsingResourceSet();

    }

 

    //使用IResourceWriter

    static void Write()

    {

        using (IResourceWriter rw = new ResourceWriter("a.resources"))

        {

            rw.AddResource("byte"0xff);

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

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

        }

    }

    //使用IResourceReader

    static void ReadUsingResourceReader()

    {

        Console.WriteLine("== 使用IResourceReader");

        using (IResourceReader rr = new ResourceReader("a.resources"))

        {

            var iter = rr.GetEnumerator();

            while (iter.MoveNext())

                Console.WriteLine("鍵: {0} 值: {1}", iter.Key, iter.Value);

        }

    }

    //使用ResourceSet

    static void ReadUsingResourceSet()

    {

        Console.WriteLine("== 使用ResourceSet");

        using (ResourceSet rs = new ResourceSet("a.resources"))

        {

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

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

            Console.WriteLine(rs.GetObject("guid"));

        }

    }

 

}

 

輸出:

== 使用IResourceReader

鍵: 文本 值: hellow

鍵: guid 值: 7f958dc9-eae2-43f5-a150-88fd8a07374e

鍵: byte 值: 255

== 使用ResourceSet

255

hellow

7f958dc9-eae2-43f5-a150-88fd8a07374e

 

.NET還提供一個ResourceManager類型來提供支持多語言的資源提取,原理是經過探索.NET中的附屬程序集(satellite assembly),關於ResourceManager的使用,能夠參考這篇文章:.NET(C#):使用ResourceManager類型.

做者:Mgen 

相關文章
相關標籤/搜索