C# の WPF (Prism)開発でバイナリデータファイルをリソースファイルにし、ソースファイルで参照したかった。
ただ調べてもほとんど情報が出てこなかったのでメモ程度に残しておく。
概要:
・WPFはプロジェクトが沢山(DLLが沢山)あるので、各プロジェクト(DLL)毎に同じファイルをリソース化するのはあほらしい。
・リソース専用のプロジェクト(DLL)を作って、一括管理したい。
事前準備:
・リソースにしたいファイルのプロパティにある「ビルドアクション」を「リソース」に変更する。
DLL内に該当ファイルを埋め込み
読み込み方法:
テキストファイルやバイナリファイルなどを取得する場合:
とすることで、Streamが取得できます。
BinaryReader や StreamReader を使ってファイル読み込みをすれば良いです。
ポイント:
1.「Application.GetResourceStream()」こいつがリソースファイルのStream が取得できる!これが一番大事
これが分かれば、あとはどんなファイルでも操作できるよね。(書き込みは無理だと思うが…)
2.「UriKind.RelativeOrAbsolute」ダメな時は変更してみてください。絶対パス、相対パス、不明 だそうです。
「UriKind.Absolute」で本来行けるはずなんだがなぁ…
3.Uri の前半「pack://application:,,,/」は固定です。
4.「Test.Resources;」はプロジェクト名(DLL名称)のはずです。
5.「Resources/Binary」はフォルダ名です。(2階層)
バイナリファイル読み込み全体:
ちなみに、画像の場合は簡単:
BitmapImage クラスが URI クラスを引数にとれるから…
ただ調べてもほとんど情報が出てこなかったのでメモ程度に残しておく。
概要:
・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 クラスを引数にとれるから…