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

Win32リソースを実行ファイルに埋め込む

ここでは、アセンブリファイルにWin32リソースを埋め込む方法を紹介します。なおここで紹介している方法は、プロジェクトをビルドした時に作成されるアセンブリファイルにWin32リソースが埋め込めれるようにする方法で、プログラムによって埋め込む方法ではありません。

リソースファイルを作成する

まず、埋め込むリソースをひとまとめにしたリソースファイルを作成します。(Resource Hackerを使用すればリソースファイルを作成しなくても大丈夫ですが、このようなツールを使用しないのであれば必要です。)

Visual Studioを使用して作成する

Visual Studioを使用してリソースファイルを作成する手順は、以下のようになります。

  1. Visual Studioのメニューから「ファイル」-「新規作成」-「ファイル」を選択する。
  2. 下図のようなダイアログが表示されるので、「ネイティブリソーステンプレート」を選択し、「開く」ボタンを押す。
    新しいファイルダイアログ
  3. 表示されたページで"ResTempl1.rct"を選択し、プロパティウィンドウの「Mfc Mode」をFalseにする。
  4. "ResTempl1.rct"(もしくはそのページ)を右クリックし、ポップアップメニューを表示し、「リソースの追加」を選択する。
    コンテキストメニューを表示
  5. 追加するリソースがファイルとしてすでに存在しているならば、「インポート」ボタンをクリックし、ファイルを選択する。ファイルとして存在していないリソースを追加するには、左側のリストで種類を選択し、「新規作成」ボタンを押す。
    「リソースの追加」ダイアログ
    ビットマップ (.bmp)、アイコン (.ico)、カーソル (.cur)、Html (.htm) などのファイルをインポートした時は、ファイルの種類によって適当なリソースの種類のノードに追加される。Visual Studioがリソースの種類を判断出来ないファイルをインポートしようとした時は、「カスタムリストの種類」ダイアログが表示され、リソースの種類を自分で入力しなければならない。例えば、マニフェストファイル (.manifest) を追加するときは、リソースの種類を「RT_MANIFEST」とする。
  6. 必要なだけリソースを追加する。
    リソースエディタ
    アセンブリファイルにバージョン情報が必要であれば、「リソースの追加」ダイアログで「Version」を新規作成し、自分で編集しなければならない。(後述するResource Hackerを使用すれば追加でリソースを埋め込めるので、そうしなくてもよい。)
  7. 必要であれば、リソースのIDを変更することができる。IDを変更するには、リソースを選択し、プロパティウィンドウでIDプロパティに新しいIDを入力する。
    ただし、基本的には、IDを変更してもリソースの値(リソース名)は変わらない。リソースの値を変更するには、値が数値ならば、IDプロパティにその数値をそのまま入力する(もしくは、IDの後ろに = を付けて、続けて値を入力する方法もある)。値が文字列ならば、IDプロパティにその文字列を""で括って入力する。
    例えばリソースの値を「1」に変更したいのであれば、IDプロパティを「1」にする(もしくは、IDが「IDR_RT_MANIFEST1」であれば、「IDR_RT_MANIFEST1=1」と入力する)。また、リソースの値を「README.HTML」に変更するのであれば、IDに「"README.HTML"」と入力する。
    リソースのIDと値は、コンテキストメニューの「リソースシンボル」で確認することができる(ただし、値が数値のリソースしか表示されない)。
    「リソースシンボル」ダイアログ
  8. 最後に、メニューの「ファイル」-「名前をつけて ResTempl1.rct を保存」(あるいは、「ResTempl1.rct の保存」、「すべてを保存」など)でリソースファイルを作成する。この時、「ファイルの種類」で「32 ビット リソース ファイル (*.res)」を選択し、拡張子を .res にする。
    リソースファイルの保存

rc.exeを使用して作成する

Visual Studioが使用できない場合は、リソースコンパイラを使ってリソースファイルを作成できます。リソースコンパイラには、Visual StudioやPlatformSDKに付属しているrc.exeの他に、GoRC.exeのようなフリーのツールもあります。ここではrc.exeを使った方法を簡単に紹介します。

  1. テキストエディタでリソーススクリプトファイル(.rc)を作成する。リソーススクリプトファイルの書き方については、「About Resource Files」などが参考になる。例えば、3つのアイコンと1つのHTMLを含むリソーススクリプトファイルは、次のようになる。
    #define IDI_ICON1 101
    #define IDI_ICON2 102
    #define IDI_ICON3 103
    
    IDI_ICON1 ICON "1.ico"
    IDI_ICON2 ICON "2.ico"
    IDI_ICON3 ICON "3.ico"
    README.HTML HTML "1.html"
    
  2. rc.exeを使ってリソーススクリプトファイルをコンパイルする。例えばリソーススクリプトファイルが"win32res.rc"であったならば、次のようなコマンドで"win32res.res"というリソースファイルを作成できる。
    rc.exe win32res.rc
    

リソースファイルを埋め込む

次に、プロジェクトをビルドした時に、作成されるアセンブリファイルにリソースファイルが埋め込まれるようにする方法を説明します。

C#で、Visual Studio 2005以上を使用する方法

  1. ソリューションエクスプローラでプロジェクトを右クリックし、ポップアップメニューを表示し、「プロパティ」を選択する。
    プロジェクトのプロパティの選択
  2. 「アプリケーション」タブにある「リソースファイル」にリソースファイル .res を指定する。
    リソースファイルを指定する
  3. これでビルドすれば、出来上がり。

VB.NETで、Visual Studio 2005以上を使用する方法

VB.NETではC#のようにネイティブリソースファイルを指定する箇所がありません。よってネイティブリソースファイルを埋め込むには、/win32resource コンパイラオプションを使用することになりますが、そうなると通常は vbc.exe を使ってビルドしなければならず、Visual Studioではビルドできなくなります。

この問題の解決法が、「Connecting the Dots : How to embed a manifest in an assembly: let me count the ways...」で紹介されています。これによると、プロジェクトファイルを書き換えることで、Visual Studioでビルドした時に /win32resource コンパイラオプションを指定できるようになります。以下にその手順を示します。

  1. ソリューションエクスプローラでプロジェクトを右クリックし、ポップアップメニューを表示し、「プロジェクトのアンロード」を選択する。
  2. ソリューションエクスプローラでプロジェクトを右クリックし、ポップアップメニューを表示し、「編集 (プロジェクト名).vbproj」を選択する。
  3. 埋め込むリソースファイルが「ResTempl1.res」という名前でプロジェクトのフォルダにある場合、次のような要素をプロジェクトファイルに追加する。
    <PropertyGroup>
      <Win32Resource>ResTempl1.res</Win32Resource>
    </PropertyGroup>
    
  4. プロジェクトファイルを閉じてから、ソリューションエクスプローラでプロジェクトを右クリックし、ポップアップメニューを表示し、「プロジェクトの再読み込み」を選択する。
  5. これでビルドすれば、出来上がり。

コンパイラオプションを使用する方法

Visual Studio 2003以下では上記のような方法は使えませんので、/win32resource コンパイラオプション(C#では、/win32res コンパイラオプション)を指定して、vbc.exe(C#では、csc.exe)でビルドします。

VB.NETでは、例えば「App.vb」をビルドしてリソースファイル「ResTempl1.res」を埋め込むには、次のようなコマンドラインを実行します。

vbc.exe /win32resource:ResTempl1.res App.vb

C#では、次のようになります。

csc.exe /win32res:ResTempl1.res App.cs

Resource Hackerを使用する方法

実行ファイルにWin32リソースを埋め込むことができるツールとして、Resource Hackerがあります。Resource Hackerを使えば、すでに実行ファイルに埋め込まれているリソースをそのままにして、新しいリソースを埋め込むこともできます。つまり、すでに埋め込まれているバージョン情報やマニフェストをそのままにして、新しいリソースを追加することができます。このようなツールを使うのは邪道かもしれませんが、非常に便利なので、簡単に使い方を紹介しておきます。

例えば、「app.exe」にリソースファイル「ResTempl1.res」を埋め込んで「app2.exe」を作成するには、次のようなコマンドラインを実行します。

ResHacker.exe -addoverwrite app.exe, app2.exe, ResTempl1.res ,,,

ここでは「-addoverwrite」コマンドを使用していますので、「ResTempl1.res」に存在しているリソースが「app.exe」にも存在しているときは、上書きされます。上書きせずにスキップするには、「-addskip」にします。

Visual Studioでプロジェクトをビルド後に、Resource Hackerを使ってリソースが自動的に追加されるようにするには、プロジェクトのプロパティの「ビルドイベント」タブにある「ビルド後に実行するコマンドライン」(C#では「ビルドイベント」タブ、Visual Studio 2005以上のVB.NETでは「コンパイル」タブの「ビルドイベント」、Visual Studio 2003以下のVB.NETでは不可)に次のようなコマンドラインを入力します。

ResHacker.exe -addoverwrite "$(TargetPath)", "$(TargetPath)", ResTempl2.res ,,,

Resource Hackerはリソースファイルに存在するリソースだけでなく、ファイルをリソースとして直接実行ファイルに埋め込むこともできます。例えば、「ビルド後に実行するコマンドライン」でアイコン「app.ico」を「101」という値で埋め込むには、次のようにします。

ResHacker.exe -addoverwrite "$(TargetPath)", "$(TargetPath)", app.ico, ICONGROUP, 101, 0

上の例ではアイコンを埋め込んでいるためリソースの種類を「ICONGROUP」としています。リソースの種類は、例えばHTMLを埋め込みたいのであれば「23」、マニフェストを埋め込みたいのであれば「24」になります。

埋め込まれたWin32リソースを確認する

アセンブリファイルに埋め込まれたWin32リソースは、Visual Studioでアセンブリファイルを開くことにより、確認できます。方法は、Visual Studioのメニュー「ファイル」-「開く」-「ファイル」でアセンブリファイルを選択するだけです。

Visual Studioでアセンブリファイルを開く

このように開いたアセンブリファイルには、リソースファイルを作成するで紹介したのと同じような方法で、Win32リソースを埋め込むこともできます。

また、先に紹介したResource Hackerのようなツールを使っても、埋め込まれたWin32リソースを確認することができます。

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

  • .NET Tipsをご利用いただく際は、注意事項をお守りください。