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

画像やテキストファイルを実行ファイルに埋め込む

注意:ここで紹介する方法は、主にVisual Studio 2003以前で使用される方法です。Visual Studio 2005以降でもこの方法は可能ですが、「Visual Studioでリソースを管理する」で紹介している方法を使ったほうがよいでしょう。

ここでは、画像やテキストファイルなどのリソースをプロジェクトに追加して、ビルドした時に作成されるアセンブリファイルに埋め込まれるようにする方法を紹介します。なおここで紹介している方法はマネージリソースを埋め込む方法であり、Win32リソースを埋め込む方法は「Win32リソースを実行ファイルに埋め込む」で紹介しています。

リソースを埋め込む

Visual Studioの場合、ソリューションエクスプローラでプロジェクトを右クリックして表示されるメニューの「追加」-「既存項目の追加」(または「新しい項目の追加」)から埋め込みたい項目を追加し、プロパティの「ビルドアクション」を「埋め込まれたりソース」に変更します。

補足:Visual Studioを使わない場合は、"/resource"オプションで出力ファイルに埋め込むリソースファイルを指定し、コンパイルします。

埋め込まれたリソースを取得する

また埋め込んだリソースを取得するには、AssemblyオブジェクトのGetManifestResourceStreamメソッドを使います。

次の例では"test.jpg"という画像が上記のような方法でプロジェクト"Project1"(Project1名前空間)に追加されている時に、これをPictureBox1に表示させています。

VB.NET
コードを隠すコードを選択
'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
C#
コードを隠すコードを選択
//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"に追加されており、その内容を取得しています。

VB.NET
コードを隠すコードを選択
'現在のコードを実行している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()
C#
コードを隠すコードを選択
//現在のコードを実行している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"に追加されているものとします。

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

'現在のコードを実行しているAssemblyを取得
Dim myAssembly As System.Reflection.Assembly = _
    System.Reflection.Assembly.GetExecutingAssembly()
'指定されたマニフェストリソースを読み込む
Dim myIcon As New Icon( _
    myAssembly.GetManifestResourceStream("Project1.Icon1.ico"))
C#
コードを隠すコードを選択
//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"という名前のリソースを取得しています。

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

Dim bmp As New Bitmap(Me.GetType(), "test.jpg")
C#
コードを隠すコードを選択
//using System.Drawing;

Bitmap bmp = new Bitmap(this.GetType(), "test.jpg");

Bitmap以外に、Iconクラスでも同様のことができます。

埋め込まれているリソースの名前を取得する

ここで使用しているリソース名(上記の例では、"Project1.test.jpg"や、"Project1.TextFile1.txt")は、AssemblyオブジェクトのGetManifestResourceNamesメソッドを使って調べることができます。次にアセンブリの全てのリソース名を取得するコードを示します。

VB.NET
コードを隠すコードを選択
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
C#
コードを隠すコードを選択
System.Reflection.Assembly asm = 
    System.Reflection.Assembly.GetExecutingAssembly();
//このアセンブリの全てのリソース名を取得する
string[] resources = asm.GetManifestResourceNames();
//リソース名を一つずつ表示する
foreach (string resource in resources)
    Console.WriteLine(resource);
  • 履歴:
  • 2007/6/28 「画像リソースを取得する」を追加。

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

  • このサイトで紹介されているコードの多くは、例外処理が省略されています。例外処理については、こちらをご覧ください。
  • コードの先頭に記述されている「Imports ??? がソースファイルの一番上に書かれているものとする」(C#では、「using ???; がソースファイルの一番上に書かれているものとする」)の意味が分からないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。