滅入るんるん

何か書きます

.NET Standardで埋め込みリソースを読み込む方法

Xamarin.Formsを使う場合、共通リソースはPCLや.NET Standardで管理したいですよね。
それを実現する一つの手段としてリソースを埋め込むという手法があります。

脳死でネットを検索するとPCLでの場合は出てきますが、最近のトレンドは.NET Standardなので、そちらの方法を紹介します。

当方の環境はVisual Studioですが、Visual Studio for MacやRiderでもUIは違っても同じようにできるはずです。

ファイルを.NET Standardプロジェクトに追加したらプロパティウィンドウで該当ファイルを見てください(プロパティウィンドウがなければ左上のメニューの表示=>プロパティウィンドウで開けます)

ビルドアクションを埋め込みリソースにしたら、ファイルの準備は完了です。

// TimeTableRepositoryクラスのメソッド内
// TimeTableRepositoryはファイルを埋め込んだプロジェクト内に存在する
// Assemblyを取るのにtypeofでてきとーなクラス指定してやるのが簡単
// PCLではType.GetTypeInfo().Assembly でらしいが.NET Standardでは Type.Assembly で取得する
Assembly assenbly = typeof(TimeTableRepository).Assembly;
// 引数は 名前空間 + ファイル名
using (var stream = assenbly.GetManifestResourceStream("Tbus.App.NETStandard.Resources.kansai_takatuki.json")
    ?? throw new Exception("not found file"))
using (var streamReader = new StreamReader(stream))
{
    string text = await streamReader.ReadToEndAsync();
}

ファイルを取得するにはこんな感じでやってみるといいと思います(こなみ)。 ファイルのパスがどうなってるのかいまいち推測しにくい!や、ほんとに埋め込まれてるかわからない!とかあれば

assenbly.GetManifestResourceNames();

を使えば実際に埋め込まれてる全てのファイルのパスを知ることができます。