【記事ツリー】
- スマホアプリ開発!《本編》
- スマホアプリ開発!《MasterDetailPage編》
- スマホアプリ開発!《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
を取得すればそこから読み込めます。……ただ、そのリソース名が
といった風に長ったらしい感じになりますので、検索用のユーティリティ関数を作成し、それを叩くようにすることをお勧めします。
// ユーティリティ
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")){
// 中略
}