ここでは、アセンブリファイルにWin32リソースを埋め込む方法を紹介します。なおここで紹介している方法は、プロジェクトをビルドした時に作成されるアセンブリファイルにWin32リソースが埋め込めれるようにする方法で、プログラムによって埋め込む方法ではありません。
まず、埋め込むリソースをひとまとめにしたリソースファイルを作成します。(Resource Hackerを使用すればリソースファイルを作成しなくても大丈夫ですが、このようなツールを使用しないのであれば必要です。)
Visual Studioを使用してリソースファイルを作成する手順は、以下のようになります。
Visual Studioが使用できない場合は、リソースコンパイラを使ってリソースファイルを作成できます。リソースコンパイラには、Visual StudioやPlatformSDKに付属しているrc.exeの他に、GoRC.exeのようなフリーのツールもあります。ここではrc.exeを使った方法を簡単に紹介します。
#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"
rc.exe win32res.rc
次に、プロジェクトをビルドした時に、作成されるアセンブリファイルにリソースファイルが埋め込まれるようにする方法を説明します。
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 コンパイラオプションを指定できるようになります。以下にその手順を示します。
<PropertyGroup> <Win32Resource>ResTempl1.res</Win32Resource> </PropertyGroup>
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
実行ファイルに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リソースは、Visual Studioでアセンブリファイルを開くことにより、確認できます。方法は、Visual Studioのメニュー「ファイル」-「開く」-「ファイル」でアセンブリファイルを選択するだけです。
このように開いたアセンブリファイルには、リソースファイルを作成するで紹介したのと同じような方法で、Win32リソースを埋め込むこともできます。
また、先に紹介したResource Hackerのようなツールを使っても、埋め込まれたWin32リソースを確認することができます。
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。