F#プロジェクトでビルドしたexeにアイコンをつける(追記)

(2016/9/26) アイコン表示サイズ, github追記しました

対象読者と動作環境

FSharpプロジェクトでビルドしたexeにアイコンを付けたい人とWindowsアプリのアイコン作っていてサイズどうすればいいか迷っている人向け
動作環境はWindows10, Visual Studio 2015
簡単に流れを書いておくと、アイコンを準備して、アイコンリソース作成、F#プロジェクトに設定してリビルドする

アイコンの準備

表示されているときにどのサイズのアイコンが表示されているかわかるように16, 24, 32, 48, 64, 96, 128, 256pxのアイコンをやっつけで作った。

ちなみにここWindows previous versions documentation | Microsoft Docsをみると

アプリケーション アイコンおよびコントロール パネルのアイテム: 16 × 16、32 × 32、48 × 48、256 × 256 でフル セットとなります。(コードで 32 〜 256 に拡大縮小します)。
.ico ファイル形式である必要があります。クラシック モードの場合、フル セットは 16 × 16、24 × 24、32 × 32、48 × 48 および 64 × 64 になります。

と書いてある。作りすぎた。

アイコンファイル(.ico)への変換は@Icon変換を使ってmyicon.icoというファイル名にした。
@icon変換 - 画像とアイコンの相互変換ツール。favicon作成にも。

リソースファイルの作成

まず、適当な名前でリソーススクリプトファイル(.rc)を作る。自分はmyicon.rcとした。
中身は下記のとおり。

MYICON ICON "myicon.ico"

アイコンリソースを記述するときはnameID ICON fileNameの順番で書く必要があり、
nameIDは、プログラムからリソースを呼び出すときの識別子になるらしい。
Win32APIで使う場合は気にする必要がありそうだが、今回は気にしないでよさそう。
リソース

二番目の"ICON"はICON文のため固定、ファイル名は各自で作ったアイコンファイル名にする。

次に、アイコンファイルとリソーススクリプトファイルをrc.exeがあるフォルダにコピーする。
自分の環境ではC:\Program Files (x86)\Windows Kits\10\bin\x64\rc.exeにあった。
なければ、WindowsSDKをインストールするなどして入手する。
管理者権限でコマンドプロンプトを起動して下記のコマンドを発行すると、リソースファイル(myicon.res)ができる

rc myicon.rc

※拡張子.resのファイルはリソースファイルではなく正確には、Compiled Resource Scriptファイルというみたい。

F#プロジェクトに設定する

リソースファイルを設定したいF#プロジェクトのfsprojと同階層にコピーする。
F#プロジェクトを開き、ソリューションエクスプローラーからプロジェクトを右クリックしてプロパティを開く。
アプリケーションタブでリソースファイルとして設定してもよいが、絶対パスとなってしまうため共同開発している場合はビルドタブのその他のフラグに下のように追記する。

--win32res:myicon.res


リビルドすれば、exeが設定したアイコンになる。

アイコン表示サイズ

エクスプローラ

エクスプローラー表示はCtrl+ホイール上下で同項目であってもサイズが変えられ、アイコン表示も変わる場合があるが、
リボンの表示で切り替えたときに表示されるアイコンサイズを記載した。


(追記)フルセットで使われるサイズのアイコンを一つずつ除いたパターンを追加
フルセットとの差分を赤字にした。
※ここで言っているフルセットとはアイコンの準備で作った8サイズのアイコンを指す。
組み合わせをやる予定は今のところなし

エクスプローラ 特大アイコン 大アイコン 中アイコン 小アイコン 一覧 詳細 並べて表示 コンテンツ
フルセット 256 256 48 24 24 24 48 32
24pxなし 256 256 48 16 16 16 48 32
32pxなし 256 256 48 24 24 24 48 48
48pxなし 256 256 64 24 24 24 64 32
256pxなし 48 48 48 24 24 24 48 32
タスクバーなど
タスクバー 起動中ウィンドウの左上アイコン スタートメニューすべてのアプリ スタート画面ピン留め(中) スタート画面ピン留め(小)
フルセット 32 24 32 32 24
24pxなし 32 16 32 32 32
32pxなし 48 24 24 48 24
48pxなし 32 24 32 32 24
256pxなし 32 24 32 32 24

github

プロジェクトをgithubに上げてみた。アイコンがexeに適用されている画像を貼っていないので見たい人は実物をどうぞ。
GitHub - sunotora/FSharpIconSample

  • IconSampleがフルセットでIconSample_noXXXがXXXを除いたプロジェクト
  • プロジェクトが分かれているのはリソースファイルを変更してリビルドしてもアイコンリソースが正しく適用されないことがあるため(古い情報が残ってしまう?)
  • タスクバー、起動中ウィンドウの左上アイコンを確認するためにFWindowsAppWPFMVVMテンプレートの初期状態を使った。