実行ファイル中にリソースを埋め込み、実行時にリソースにアクセスする - C#
実行ファイルにリソースを埋め込み、プログラムから埋め込んだリソースにアクセスする方法を紹介します。
手順
はじめに、リソースを作成します。今回は下図の画像を作成しました。
画像はPNG形式の画像ファイルとして保存しました。
次に作成したリソース画像をプロジェクトに追加します。ソリューションエクスプローラを選択し、右クリックでポップアップメニューを表示します。[追加]メニューの[既存の項目]メニューを選択します。ファイル選択ダイアログボックスが表示されるので、先ほど作成したPNG形式の画像を選択します。
ソリューションエクスプローラにファイルが追加されたことが確認できました。
次に、ソリューションエクスプローラの追加したファイル(res.png)を選択し、プロパティウィンドウの[ビルドアクション]プロパティを確認します。ビルドアクションをデフォルトでは[コンテンツ]になっていますのでこれを[埋め込まれたリソース]に変更します。
[埋め込まれたリソース]に変更、はよく設定し忘れますので注意してください。
UI
フォームを設計します。今回はButtonを1つとPanelを一つ配置しました。
コード
ButtonのClickイベントを実装します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Reflection;
using System.IO;
namespace ResourceAccess
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Assembly assembly = Assembly.GetExecutingAssembly();
Stream stream = assembly.GetManifestResourceStream("ResourceAccess.res.png");
Bitmap bmp = new Bitmap(stream);
Graphics g = panel1.CreateGraphics();
g.DrawImage(bmp,new Point(10,10));
}
}
}
説明
Assembly assembly = Assembly.GetExecutingAssembly();
にて現在の実行ファイルのアセンブリを取得します。
Stream stream = assembly.GetManifestResourceStream("ResourceAccess.res.png");
にて、現在のアセンブリに埋め込まれたリソースのストリームを取得します。リソース名は
(実行ファイルの名前空間).(追加したファイル名)
となります。
Bitmap bmp = new Bitmap(stream);
にて取得したストリームを用いBitmapを読み込みます。
Graphics g = panel1.CreateGraphics();
g.DrawImage(bmp,new Point(10,10));
読み込んだビットマップをPanelのキャンバスに描画します。
実行結果
プログラムを実行しボタンを押すとリソースとして組み込んだ画像がPanel1の内部に表示されます。
サブフォルダに画像を配置した場合
下図のpic1.pngのようにサブフォルダに画像を配置した場合は、サブフォルダを含めた名前空間を指定する必要があります。リソース名は
"ResourceAccess.fig.pic1.png"
となります。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用