C# .Net アプリケーションで複数のアイコンを登録する方法

C# .Net のアプリケーションでショートカットアイコン用に複数のアイコンファイルをEXEに入れたかったのですが、
Visual Studio 2013だけではできませんでした。

参考イメージ
ショートカット アイコンの変更 - Google 検索

では本題です。
長いので目次付けました。

おすすめは最後の「InsertIconsを使って後から複数のアイコンを追加する方法」です。

そもそもアイコンを設定する方法

1つだけのアイコンを設定する方法は簡単です。
プロジェクトのプロパティからアイコンを設定するだけです。
f:id:kitunechan:20160428115727p:plain:w450
プロジェクトにIconファイルを追加しておけば、ドロップダウンに表示されます。

Win32リソースを作成して複数のアイコンを登録する方法

参考サイト
Win32ソースを実行ファイルに埋め込む: .NET Tips: C#, VB.NET


1.まずは、リソースファイルを作ります。
  ファイル → 新規作成 → ファイル を選択します。
f:id:kitunechan:20160428130336p:plain:w450

2.ネイティブリソーステンプレートを選択します。
f:id:kitunechan:20160428130432p:plain:w350

3.rctファイルが作成されます。
  右クリックメニューからリソースを追加します。
f:id:kitunechan:20160428130528p:plain:w300

4.Iconを選択して、インポートからIconファイルを追加します。
f:id:kitunechan:20160428130619p:plain:w300

5.こんな感じでアイコンリソースが追加されます。
  繰り返して複数のアイコンを追加します。
f:id:kitunechan:20160428130713p:plain

6.作成したファイルを名前を付けて保存します。
  この時に、rctとなっているところを 32ビットリソースファイル(*.res) に変更して保存します。
f:id:kitunechan:20160428131617p:plain:w350

7.作成したリソースファイル(*.res)をソリューションのプロパティで指定します。
  ※フォルダ部分のパスは省略してあります
f:id:kitunechan:20160428130908p:plain:w350

これでビルドすれば出来上がりです。

ただし、この方法でアイコンを登録すると、自分でアセンブリ情報とマニュフェスト情報をこのリソースファイルに記述必要があります。
EXEのバージョン情報とか必要なければこの方法でいいです。

まあ、こんな悲しい事になります。
f:id:kitunechan:20160428132116p:plain:h250

Resource Hackerを使って後から複数のアイコンを追加する方法

アセンブリ情報とマニュフェスト情報そのまま残したい場合です。

通常通りアイコンを設定します。「アイコンとマニュフェスト」の方ですね!
そして、ビルド後にResource Hackerを使いアイコンリソースを追加する感じです。

参考URL:Win32ソースを実行ファイルに埋め込む: .NET Tips: C#, VB.NET(下の方)
     Resource Hacker

ビルドイベントの「ビルド後に実行するコマンドライン」で処理を行うと便利です。
ソースファイル(res)でアイコン追加する場合はこんな記述になります。

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

[ResHacker.exeへのパス] -addoverwrite "対象のEXE", "出力先", "リソースファイル",,,
って感じです。
最後のカンマ3つも必要なので省略しないように! 画像ではみえませーん
f:id:kitunechan:20160428134755p:plain:w350

これでビルドすればアセンブリ情報とマニュフェスト情報をそのままにアイコンの追加ができます。
が、「アイコンとマニュフェスト」で設定したアイコンファイルは無駄になる場合があります。

何故かは次の項で↓

InsertIconsを使って後から複数のアイコンを追加する方法

Resource Hackerを使ってアイコンを追加すると101からIDが振られます。
Application iconのID規定値が32512(IDI_APPLICATION)のようで、実行ファイル(EXE)のアイコンはIDが一番小さいものが使われるみたいなので「アイコンとマニュフェスト」で指定したアイコンはEXEのアイコンとして使われません。

そんな事情を考慮して作られた?のが InsertIcons です。
Add multiple icons to a .NET application

追加されるアイコンのIDが40000から振られるため、「アイコンとマニュフェスト」で指定したアイコンがEXEのアイコンになります。

Resource Hackerと使い方は同じです。
ビルドイベントの「ビルド後に実行するコマンドライン」が便利なので使用します。

記述方法は4種類あるようです。

1.アイコンファイルをそれぞれ指定する方法

InsertIcons.exe myprogram.exe icon1.ico;icon2.ico;icon3.ico

2.アイコンのファイル名をテキストファイルに記述する方法
  1行に1つずつ記述します

InsertIcons.exe myprogram.exe myiconlist.txt

3.指定してフォルダ内の.icoファイルをすべて取り込む方法
  アイコンはアルファベット順に追加されます。

InsertIcons.exe myprogram.exe c:\path\to\my\iconfolder

4.アイコンファイルの指定がない場合は標準入力から読み込みます。

dir /b *.ico | InsertIcons.exe myprogram.exe


2のテキストファイルを使ってアイコンファイルを指定する方法だとこんな感じです。
f:id:kitunechan:20160428140807p:plain:w350

テキストファイルはこんな感じです。
相対パスで記述する場合はプロジェクトの場所が基準にされるため注意してください。

Icon2.ico
Icon3.ico
Icon4.ico
Icon5.ico

あとはビルドするだけです。
これで気持よく複数のアイコンを登録することができます。