WPF Prism で 他プロジェクトのDLLリソースファイルを参照する(ソース側)

C# の WPF (Prism)開発でバイナリデータファイルをリソースファイルにし、ソースファイルで参照したかった。
ただ調べてもほとんど情報が出てこなかったのでメモ程度に残しておく。

概要:
・WPFはプロジェクトが沢山(DLLが沢山)あるので、各プロジェクト(DLL)毎に同じファイルをリソース化するのはあほらしい。
・リソース専用のプロジェクト(DLL)を作って、一括管理したい。

事前準備:
・リソースにしたいファイルのプロパティにある「ビルドアクション」を「リソース」に変更する。
 DLL内に該当ファイルを埋め込み

読み込み方法:
テキストファイルやバイナリファイルなどを取得する場合:
Uri uri = new("pack://application:,,,/Test.Resources;component/Resources/Binary/A.bin", UriKind.RelativeOrAbsolute);
StreamResourceInfo sri = Application.GetResourceStream(uri);
using BinaryReader br = new(sri.Stream);

とすることで、Streamが取得できます。
BinaryReader や StreamReader を使ってファイル読み込みをすれば良いです。

ポイント:
1.「Application.GetResourceStream()」こいつがリソースファイルのStream が取得できる!これが一番大事
   これが分かれば、あとはどんなファイルでも操作できるよね。(書き込みは無理だと思うが…)
2.「UriKind.RelativeOrAbsolute」ダメな時は変更してみてください。絶対パス、相対パス、不明 だそうです。
  「UriKind.Absolute」で本来行けるはずなんだがなぁ…
3.Uri の前半「pack://application:,,,/」は固定です。
4.「Test.Resources;」はプロジェクト名(DLL名称)のはずです。
5.「Resources/Binary」はフォルダ名です。(2階層)


バイナリファイル読み込み全体:
Uri uri = new(@$"pack://application:,,,/Test.Resources;component/Resources/Binary/A.bin", UriKind.RelativeOrAbsolute);
using BinaryReader br = new(Application.GetResourceStream(uri).Stream);
List<byte> value = new();
byte[] tmp = new byte[2];
while (0 < br.Read(tmp, 0, 2))
{
    value.AddRange(tmp);
}




ちなみに、画像の場合は簡単:
BitmapImage tmp = new(new Uri("pack://application:,,,/Test.Resources;component/Resources/Image/A.png", UriKind.Absolute));
tmp.Freeze();

BitmapImage クラスが URI クラスを引数にとれるから…

/**********************************************************************************
本記事はGooブログから作成者本人が移行しました。
 **********************************************************************************/

コメント

このブログの人気の投稿

ヨドバシカメラの店舗購入履歴を見るには…

C# の WPF の DataGrid で 行を交互に背景色を変える+選択色を変える+カラムが無い所も変える…

Visual Studio の ホットリロードが動かない場合に確認するところ