Xamarin.Forms+ReactivePropertyでスマホアプリ開発!《ファイル読み込み編》


【記事ツリー】

概要

 Xamarin.Forms+ReactivePropertyでスマホアプリ開発!《本編》において、どのように内部ファイル(リソースファイル)を読み込んだのかといった話です。この記事は短めです。

やり方

プロジェクト内に読み込みたいファイルを組み込む

 WPFとかでもお馴染みですね。今回の開発ではShared Projectで開発していますので、Shared Project内にファイルを設定しましょう(下記画像では「Resources」フォルダ内に設置)。

 また、ソリューションエクスプローラー内で当該ファイルをクリックし、プロパティ欄でビルドアクションを「埋め込みリソース」にしておくのを忘れないようにしましょう。もちろん、出力ディレクトリにコピーしないようにします。

読み込み用コード

 まず、System.Reflection.Assembly.GetExecutingAssembly()により、System.Reflection.Assembly型のアセンブリ情報を得ます。ここで言うところの「アセンブリ」とは、アセンブリ言語のことではなく、「ソフトウェア自体の設定情報」とでも考えて下さい。
 次に、System.Reflection.Assembly#GetManifestResourceNames()メソッドにより、string[]型でリソース名の一覧を取得します。ここで言うところの「リソース」とは、「アセンブリ」に埋め込まれている、ファイル等のデータのことです。
 後は、そこから目的のファイルに対応したリソース名を探しだし、System.Reflection.Assembly#GetManifestResourceStream(リソース名)メソッドで当該リソースにおけるStreamを取得すればそこから読み込めます。……ただ、そのリソース名が

といった風に長ったらしい感じになりますので、検索用のユーティリティ関数を作成し、それを叩くようにすることをお勧めします。

sample.cs
// ユーティリティ
static class Utility
{
    // リソースのStreamをファイル名から取得する
    public static Stream GetResourceStream(string name) {
        // リフレクションにより、アセンブリ情報を取得する
        var assembly = System.Reflection.Assembly.GetExecutingAssembly();
        // アセンブリ情報から、リソース名の一覧を取得する
        string[] resnames = assembly.GetManifestResourceNames();
        // リソース名の一覧を検索し、条件に合ったものを返す
        var regex = new Regex($"Resources.{name}$");
        foreach(string resname in resnames) {
            if (regex.IsMatch(resname)) {
                return assembly.GetManifestResourceStream(resname);
            }
        }
        return null;
    }
}

// 使用例
using (var stream = Utility.GetResourceStream("LevelExpList.txt")){
    // 中略
}