いつもどこかでデスマーチ♪

不定期に、私の日常を書き込みしていきます。

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

2023年10月24日 15時14分16秒 | .NET系
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 クラスを引数にとれるから…

コメント    この記事についてブログを書く
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« C# WPF + MVVM でキー押下処... | トップ | 自宅PCをWindows11に上げたら... »

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。

.NET系」カテゴリの最新記事