注意:ここで紹介する方法は、主にVisual Studio 2003以前で使用される方法です。Visual Studio 2005以降でもこの方法は可能ですが、「Visual Studioでリソースを管理する」で紹介している方法を使ったほうがよいでしょう。
ここでは、画像やテキストファイルなどのリソースをプロジェクトに追加して、ビルドした時に作成されるアセンブリファイルに埋め込まれるようにする方法を紹介します。なおここで紹介している方法はマネージリソースを埋め込む方法であり、Win32リソースを埋め込む方法は「Win32リソースを実行ファイルに埋め込む」で紹介しています。
Visual Studioの場合、ソリューションエクスプローラでプロジェクトを右クリックして表示されるメニューの「追加」-「既存項目の追加」(または「新しい項目の追加」)から埋め込みたい項目を追加し、プロパティの「ビルドアクション」を「埋め込まれたりソース」に変更します。
補足:Visual Studioを使わない場合は、"/resource"オプションで出力ファイルに埋め込むリソースファイルを指定し、コンパイルします。
また埋め込んだリソースを取得するには、AssemblyオブジェクトのGetManifestResourceStreamメソッドを使います。
次の例では"test.jpg"という画像が上記のような方法でプロジェクト"Project1"(Project1名前空間)に追加されている時に、これをPictureBox1に表示させています。
'Imports System.Drawing '現在のコードを実行しているAssemblyを取得 Dim myAssembly As System.Reflection.Assembly = _ System.Reflection.Assembly.GetExecutingAssembly() '指定されたマニフェストリソースを読み込む Dim bmp = _ New Bitmap(myAssembly.GetManifestResourceStream("Project1.test.jpg")) 'PictureBox1に表示 PictureBox1.Image = bmp
//using System.Drawing; //現在のコードを実行しているAssemblyを取得 System.Reflection.Assembly myAssembly = System.Reflection.Assembly.GetExecutingAssembly(); //指定されたマニフェストリソースを読み込む Bitmap bmp = new Bitmap(myAssembly.GetManifestResourceStream("Project1.test.jpg")); //PictureBox1に表示 PictureBox1.Image = bmp;
次の例では"TextFile1.txt"というテキストファイルが"Project1"に追加されており、その内容を取得しています。
'現在のコードを実行しているAssemblyを取得 Dim myAssembly As System.Reflection.Assembly = _ System.Reflection.Assembly.GetExecutingAssembly() '指定されたマニフェストリソースを読み込む Dim sr As New System.IO.StreamReader( _ myAssembly.GetManifestResourceStream("Project1.TextFile1.txt"), _ System.Text.Encoding.GetEncoding("shift-jis")) '内容を読み込む Dim s As String = sr.ReadToEnd() '後始末 sr.Close()
//現在のコードを実行しているAssemblyを取得 System.Reflection.Assembly myAssembly = System.Reflection.Assembly.GetExecutingAssembly(); //指定されたマニフェストリソースを読み込む System.IO.StreamReader sr = new System.IO.StreamReader( myAssembly.GetManifestResourceStream("Project1.TextFile1.txt"), System.Text.Encoding.GetEncoding("shift-jis")); //内容を読み込む string s = sr.ReadToEnd(); //後始末 sr.Close();
埋め込まれたアイコンは次のように取得します。ここでは"Icon1.ico"というアイコンが"Project1"に追加されているものとします。
'Imports System.Drawing '現在のコードを実行しているAssemblyを取得 Dim myAssembly As System.Reflection.Assembly = _ System.Reflection.Assembly.GetExecutingAssembly() '指定されたマニフェストリソースを読み込む Dim myIcon As New Icon( _ myAssembly.GetManifestResourceStream("Project1.Icon1.ico"))
//using System.Drawing; //現在のコードを実行しているAssemblyを取得 System.Reflection.Assembly myAssembly = System.Reflection.Assembly.GetExecutingAssembly(); //指定されたマニフェストリソースを読み込む Icon myIcon = new Icon( myAssembly.GetManifestResourceStream("Project1.Icon1.ico"));
画像のリソースをBitmapオブジェクトで取得する方法は、上記で紹介した以外に、Bitmapのコンストラクタ"Bitmap(Type, String)"を使用する方法もあります。"Type"には、リソースの名前で使用される名前空間にあるクラスの型を指定します。例えばリソースの名前が"Project1.test.jpg"であれば、"Type"にはProject1名前空間にあるクラスの型を、"String"には"test.jpg"を指定します。
以下の例では、自分自身(VB.NETでは"Me"、C#では"this")と同じ名前空間にある"test.jpg"という名前のリソースを取得しています。
'Imports System.Drawing Dim bmp As New Bitmap(Me.GetType(), "test.jpg")
//using System.Drawing; Bitmap bmp = new Bitmap(this.GetType(), "test.jpg");
Bitmap以外に、Iconクラスでも同様のことができます。
ここで使用しているリソース名(上記の例では、"Project1.test.jpg"や、"Project1.TextFile1.txt")は、AssemblyオブジェクトのGetManifestResourceNamesメソッドを使って調べることができます。次にアセンブリの全てのリソース名を取得するコードを示します。
Dim asm As System.Reflection.Assembly = _ System.Reflection.Assembly.GetExecutingAssembly() 'このアセンブリの全てのリソース名を取得する Dim resources As String() = asm.GetManifestResourceNames() 'リソース名を一つずつ表示する Dim resource As String For Each resource In resources Console.WriteLine(resource) Next
System.Reflection.Assembly asm = System.Reflection.Assembly.GetExecutingAssembly(); //このアセンブリの全てのリソース名を取得する string[] resources = asm.GetManifestResourceNames(); //リソース名を一つずつ表示する foreach (string resource in resources) Console.WriteLine(resource);