アイコンは外部ファイル読み込みではなく埋め込みたい
Visual Studio 2019ではなく、Visual Studio Codeで書くという縛りを設けているのだが、早速ハマったことがあり解決したのでログとして残しておく。
宇宙最強のIDEであるVisual Studio様で開発していると、GUIパーツの埋め込みリソース周りはほぼノーコードで実装できてしまう。自動的に.resx, .resourcesなどの生成とビルド時オプションの指定?なのか、それすらわからんというか意識したこともない。今回はexeのアイコン画像の指定(全く苦労しなかった)と、タスクバーアイコンの画像指定(MSのexampleを見つけられなかった && 情報が古いのか.net coreと.net frameworkでの差異なのかなんなのか && 嘘800 で時間使った)について。
.exe(とWindowsFormsタイトルのアイコン)
.exe(とWindowsFormsタイトルのアイコン)のアイコン指定は簡単だ。今回はプロジェクトディレクトリに"resources"というディレクトリを作成し、そこに"camera_icon.ico"というアイコン画像を配置している。埋め込みではなく単純にビルド時に出力したいと言うなら、画像の.gitkeepのように書けば出力される。
プロジェクトファイルに下記を追加する。
<PropertyGroup>
<ApplicationIcon>resources\camera_icon.ico</ApplicationIcon>
</PropertyGroup>
これだけである。
タスクバーアイコン
検索の仕方が悪いのか、そもそもc#使いはVisual Studioを使わない理由が無いからなのか。調べるのに時間がかかった。上と同じ画像ファイルをタスクバーアイコンに設定する。
プロジェクトファイルに下記を追加する。
<ItemGroup>
<EmbeddedResource Include="resources\camera_icon.ico" LogicalName="camera_icon.ico" />
</ItemGroup>
読み込みはこう。
private void InitializeComponent()
{
...
// icon
icon = new NotifyIcon();
icon.Visible = true;
icon.Text = Utility.Concat(settings.ApplicationTitle, " ", settings.ApplicationVersion);
// ここ!!!
var asm = Assembly.GetEntryAssembly();
using var stream = asm.GetManifestResourceStream("camera_icon.ico");
icon.Icon = new Icon(stream);
...
}
System.IO.Streamで返ってくるので、埋め込みまくって何にでも使えるんじゃないじゃろか。
おわり