DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

.resxファイル(XMLリソースファイル)を作成する、読み込む

ここでは、プログラムで.resxファイル(XMLリソースファイル)を作成する方法と、.resxファイルからリソースを取得する方法を紹介します。

なお、Visual Studioを使用してリソースファイルを作成したり、リソースを取得する方法は、「Visual Studioでリソースを管理する」で説明しています。

.resxファイルを作成する

ResXResourceWriterクラスを使用すると、簡単に.resxファイルを作成することができます。ResXResourceWriter.AddResourceメソッドでリソースを追加し、ResXResourceWriter.Generateメソッドで書き込みます。

Generateメソッドは1度しか呼び出すことができず、CloseメソッドやDisposeメソッドでもGenerateメソッドが呼び出されるため、Generateメソッドを呼び出さずにCloseメソッドやDisposeメソッドを呼び出すだけで十分です。

このクラス(および、この後で紹介するResXResourceSetやResXResourceReaderクラスも)を使用するには、System.Windows.Forms.dllが参照設定に入っている必要があります。

以下に示す例では、文字列とBitmapのリソースを追加して、.resxファイルを作成しています。

VB.NET
コードを隠すコードを選択
'保存先のファイルのパス
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()
C#
コードを隠すコードを選択
//保存先のファイルのパス
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ファイルからリソースを取得する

.resxファイルからリソースを取得する時は、ResXResourceSetクラスを使うと、簡単にできます。リソース名からリソースを取得するには、ResXResourceSet.GetObjectメソッドResXResourceSet.GetStringメソッドを使用します。また、ResXResourceSetクラスはIDictionaryEnumeratorを実装していますので、foreachを使用して、リソースを列挙することもできます。

以下に示す例では、先に示したサンプルで作成した.resxファイルからリソースを取得しています。また、すべてのリソースを列挙しています。

VB.NET
コードを隠すコードを選択
'読み込む.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()
C#
コードを隠すコードを選択
//読み込む.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クラスを使用してリソースを列挙することもできます。

VB.NET
コードを隠すコードを選択
'読み込む.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()
C#
コードを隠すコードを選択
//読み込む.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();

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • このサイトで紹介されているコードの多くは、例外処理が省略されています。例外処理については、こちらをご覧ください。
  • Windows Vista以降でUACが有効になっていると、ファイルへの書き込みに失敗する可能性があります。詳しくは、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。