[Visual Studio Code][c#] 埋め込みリソース

アイコンは外部ファイル読み込みではなく埋め込みたい

Visual Studio 2019ではなく、Visual Studio Codeで書くという縛りを設けているのだが、早速ハマったことがあり解決したのでログとして残しておく。

宇宙最強のIDEであるVisual Studio様で開発していると、GUIパーツの埋め込みリソース周りはほぼノーコードで実装できてしまう。自動的に.resx, .resourcesなどの生成とビルド時オプションの指定?なのか、それすらわからんというか意識したこともない。今回はexeのアイコン画像の指定(全く苦労しなかった)と、タスクバーアイコンの画像指定(MSのexampleを見つけられなかった && 情報が古いのか.net coreと.net frameworkでの差異なのかなんなのか && 嘘800 で時間使った)について。

vscode_image

.exe(とWindowsFormsタイトルのアイコン)

.exe(とWindowsFormsタイトルのアイコン)のアイコン指定は簡単だ。今回はプロジェクトディレクトリに"resources"というディレクトリを作成し、そこに"camera_icon.ico"というアイコン画像を配置している。埋め込みではなく単純にビルド時に出力したいと言うなら、画像の.gitkeepのように書けば出力される。

プロジェクトファイルに下記を追加する。

  <PropertyGroup>
    <ApplicationIcon>resources\camera_icon.ico</ApplicationIcon>
  </PropertyGroup>

これだけである。

exe_icon

タスクバーアイコン

検索の仕方が悪いのか、そもそも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で返ってくるので、埋め込みまくって何にでも使えるんじゃないじゃろか。

taskbar_icon

おわり