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

リソースファイルからリソースを取得する

注意:Visual Studio 2005以降では、こちらで紹介している方法よりも、「Visual Studioでリソースを管理する」で紹介している方法をお勧めします。

リソースファイル(マネージリソースファイル)とは、文字列や画像などのリソースの情報を文字列との組み合わせで保存した、拡張子が .resources または .resx のファイルのことです。例えば、リソースファイルを使用すると、いろいろな言語のために複数のリソースファイルを用意することにより、多言語対応のアプリケーションを作成することができます。ここでは、アセンブリファイルに埋め込まれたリソースファイルから、リソースを取得する方法を紹介します。

なお、ここで紹介している方法は、主にVisual Studio 2003以前での使用を想定しています。Visual Studio 2005以降では、もっと簡単な方法があります。詳しくは、「Visual Studioでリソースを管理する」をご覧ください。

リソースファイルの作成と埋め込み

リソースファイルを作成するには、ResEditorを使うと便利です。ResEditorはソースコードとして.NET Framework SDKに入っています。"C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Samples\Tutorials\resourcesandlocalization\reseditor"あたりにある"build.bat"を実行してコンパイルします。ResEditorで作成したリソースファイルは、.resourcesファイルまたは.resXファイルとして保存します。ただし、アセンブリファイルに埋め込むのは、.resourcesファイルです。なお、.NET Framework 2.0以降は、ResEditorがなくなってしまったようです。

この他の方法としては、テキストファイルや.resXファイルから.resourcesファイルに変換するツールとして、Resgen.exeがあります。また、画像ファイルを.resXファイルに変換するツールとして、ResXGenがあります。詳しくは、「リソース ファイルの作成」をご覧ください。

また、サードパーティーのリソースエディタとして、以下のようなものがあるようです。

作成した.resourcesファイルは、「埋め込まれたリソース」として、プロジェクトに追加します。その具体的な方法は、「画像やテキストファイルを実行ファイルに埋め込む」で説明しています。

リソースを取得する

.resourcesファイルから値を取得するには、ResourceManagerクラスのGetObjectメソッドGetStringメソッドを使います。

以下の例では、埋め込まれたリソースファイル「Resource1.resources」から、文字列のリソース「text1」と画像のリソース「image1」を取得しています。

VB.NET
コードを隠すコードを選択
'Imports System.Drawing

'現在実行しているAssemblyを取得する
Dim asm As System.Reflection.Assembly
asm = System.Reflection.Assembly.GetExecutingAssembly()
'または次のようにもできる
'asm = Me.GetType().Assembly

'リソースが埋め込まれたアセンブリが別のアセンブリで、
'"ResourceAssembly"という名前の時は次のようにする
'asm = System.Reflection.Assembly.Load("ResourceAssembly")

'ResourceManagerオブジェクトの作成
'リソースファイル名が"Resource1.resources"だとする
Dim rm As New System.Resources.ResourceManager( _
    asm.GetName().Name + ".Resource1", asm)

'リソースファイルから文字列を取り出す
Dim s As String = rm.GetString("text1")
'リソースファイルから画像を取り出す
Dim bmp As Bitmap = CType(rm.GetObject("image1"), Bitmap)
C#
コードを隠すコードを選択
//using System.Drawing;

//現在実行しているAssemblyを取得する
System.Reflection.Assembly asm;
asm = System.Reflection.Assembly.GetExecutingAssembly();
//または次のようにもできる
//asm = this.GetType().Assembly;

//リソースが埋め込まれたアセンブリが別のアセンブリで、
//"ResourceAssembly"という名前の時は次のようにする
//asm = System.Reflection.Assembly.Load("ResourceAssembly");

//ResourceManagerオブジェクトの作成
//リソースファイル名が"Resource1.resources"だとする
System.Resources.ResourceManager rm =
    new System.Resources.ResourceManager(
        asm.GetName().Name + ".Resource1", asm);

//リソースファイルから文字列を取り出す
string s = rm.GetString("text1");
//リソースファイルから画像を取り出す
Bitmap bmp = (Bitmap) rm.GetObject("image1");
  • 履歴:
  • 2016/6/19 説明の補充など。

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

  • コードの先頭に記述されている「Imports ??? がソースファイルの一番上に書かれているものとする」(C#では、「using ???; がソースファイルの一番上に書かれているものとする」)の意味が分からないという方は、こちらをご覧ください。
  • Windows Vista以降でUACが有効になっていると、ファイルへの書き込みに失敗する可能性があります。詳しくは、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。