LoginSignup
0
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-04-08

【記事ツリー】

概要

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

やり方

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

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

image.png

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

image.png

読み込み用コード

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

2018-04-08_205250.png

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

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")){
    // 中略
}
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1