注意: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」を取得しています。
'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)
//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");