ここでは、プログラムで.resxファイル(XMLリソースファイル)を作成する方法と、.resxファイルからリソースを取得する方法を紹介します。
なお、Visual Studioを使用してリソースファイルを作成したり、リソースを取得する方法は、「Visual Studioでリソースを管理する」で説明しています。
ResXResourceWriterクラスを使用すると、簡単に.resxファイルを作成することができます。ResXResourceWriter.AddResourceメソッドでリソースを追加し、ResXResourceWriter.Generateメソッドで書き込みます。
Generateメソッドは1度しか呼び出すことができず、CloseメソッドやDisposeメソッドでもGenerateメソッドが呼び出されるため、Generateメソッドを呼び出さずにCloseメソッドやDisposeメソッドを呼び出すだけで十分です。
このクラス(および、この後で紹介するResXResourceSetやResXResourceReaderクラスも)を使用するには、System.Windows.Forms.dllが参照設定に入っている必要があります。
以下に示す例では、文字列とBitmapのリソースを追加して、.resxファイルを作成しています。
'保存先のファイルのパス Dim resxFile As String = "C:\test\1.resx" 'ResXResourceWriterを作成する Dim writer As New System.Resources.ResXResourceWriter(resxFile) '文字列のリソースを追加する writer.AddResource("Message", "こんにちは。") 'さらに、Bitmapのリソースを追加する Dim img As New System.Drawing.Bitmap("C:\test\1.bmp") writer.AddResource("Image", img) 'ファイルに書き込んで、閉じる writer.Close()
//保存先のファイルのパス string resxFile = @"C:\test\1.resx"; //ResXResourceWriterを作成する System.Resources.ResXResourceWriter writer = new System.Resources.ResXResourceWriter(resxFile); //文字列のリソースを追加する writer.AddResource("Message", "こんにちは。"); //さらに、Bitmapのリソースを追加する System.Drawing.Bitmap img = new System.Drawing.Bitmap(@"C:\test\1.bmp"); writer.AddResource("Image", img); //ファイルに書き込んで、閉じる writer.Close();
.resxファイルからリソースを取得する時は、ResXResourceSetクラスを使うと、簡単にできます。リソース名からリソースを取得するには、ResXResourceSet.GetObjectメソッドやResXResourceSet.GetStringメソッドを使用します。また、ResXResourceSetクラスはIDictionaryEnumeratorを実装していますので、foreachを使用して、リソースを列挙することもできます。
以下に示す例では、先に示したサンプルで作成した.resxファイルからリソースを取得しています。また、すべてのリソースを列挙しています。
'読み込む.resxファイルのパス Dim resxFile As String = "C:\test\1.resx" 'ResXResourceSetを作成する Dim resx As New System.Resources.ResXResourceSet(resxFile) 'リソース名"Message"の文字列リソースを取得する Dim message As String = resx.GetString("Message") 'リソース名"Image"のBitmapリソースを取得する Dim img As System.Drawing.Bitmap = _ DirectCast(resx.GetObject("Image"), System.Drawing.Bitmap) 'リソースをすべて列挙する For Each entry As System.Collections.DictionaryEntry In resx Console.WriteLine("リソース名:{0}", entry.Key) Console.WriteLine("リソースの値:{0}", entry.Value) Next '閉じる resx.Close()
//読み込む.resxファイルのパス string resxFile = @"C:\test\1.resx"; //ResXResourceSetを作成する System.Resources.ResXResourceSet resx = new System.Resources.ResXResourceSet(resxFile); //リソース名"Message"の文字列リソースを取得する string message = resx.GetString("Message"); //リソース名"Image"のBitmapリソースを取得する System.Drawing.Bitmap img = (System.Drawing.Bitmap)resx.GetObject("Image"); //リソースをすべて列挙する foreach (System.Collections.DictionaryEntry entry in resx) { Console.WriteLine("リソース名:{0}", entry.Key); Console.WriteLine("リソースの値:{0}", entry.Value); } //閉じる resx.Close();
または、ResXResourceReaderクラスを使用してリソースを列挙することもできます。
'読み込む.resxファイルのパス Dim resxFile As String = "C:\test\1.resx" 'ResXResourceReaderを作成する Dim reader As New System.Resources.ResXResourceReader(resxFile) 'リソースをすべて列挙する For Each entry As System.Collections.DictionaryEntry In reader Console.WriteLine("リソース名:{0}", entry.Key) Console.WriteLine("リソースの値:{0}", entry.Value) Next '閉じる reader.Close()
//読み込む.resxファイルのパス string resxFile = @"C:\test\1.resx"; //ResXResourceReaderを作成する System.Resources.ResXResourceReader reader = new System.Resources.ResXResourceReader(resxFile); //リソースをすべて列挙する foreach (System.Collections.DictionaryEntry entry in reader) { Console.WriteLine("リソース名:{0}", entry.Key); Console.WriteLine("リソースの値:{0}", entry.Value); } //閉じる reader.Close();