酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Windowsストアアプリで実行ファイルまたはアセンブリに埋め込まれたリソースを取得する

Windowsストアアプリで「埋め込まれたリソース」を取得してみましょう。

実行中のDLLアセンブリにアクセスするためには、下記のようにAssembly.GetExecutingAssemblyメソッドAssemblyオブジェクトを取得していました。

var assembly = System.Reflection.Assembly.GetExecutingAssembly();

Windowsストアアプリでは、Assemblyクラスの静的メソッドのGetExecutingAssemblyメソッドが使用できませんので、代わりの手段を使用する必要があります。上記のコードはWindowsストアアプリではビルドエラーになってしまいますので、Assemblyを取得するためには下記のように書き換えることができます。

//using System.Reflection;

var assembly = typeof(App1.App).GetTypeInfo().Assembly;

本記事内で紹介するサンプルコードのファイル構成は下図のような構成になっているものとします。プロジェクトのルートディレクトリに2003_00351.JPGが存在しているということにします。

f:id:ch3cooh393:20140828112031p:plain

2003_00351.JPGのビルドアクション埋め込まれたリソースにしておきます。

f:id:ch3cooh393:20140828112008p:plain

準備が整いましたので、下記のサンプルコードで埋め込まれたリソースのストリームを取得してみましょう。

先ほどの方法でAssemblyオブジェクトが取得できましたので、引数にApp1.2003_00351.JPGのように完全なリソース名で指定して、GetManifestResourceStreamメソッドで埋め込まれたリソースのストリームを取得します。

//using System.Reflection;

var assembly = typeof(App1.App).GetTypeInfo().Assembly;
var resStream 
  = assembly.GetManifestResourceStream("App1.2003_00351.JPG");

アセンブリに埋め込まれているリソースの一覧を取得する

稀にGetManifestResourceStreamメソッドを使ったときに、戻り値がnullになっていることがあります。大抵の場合はアセンブリに指定したリソースが含まれていないか、リソース名を間違っている可能性が高いです。GetManifestResourceNamesメソッドで、アセンブリに含まれるリソースの一覧を取得しましょう。

//using System.Reflection;

var assembly = typeof(App1.App).GetTypeInfo().Assembly;
var resourceNames = assembly.GetManifestResourceNames();

アセンブリにリソースが含まれているのか、正しいリソース名を指定できているかのか確認してみましょう。

関連記事

WindowsランタイムAPI(Windows Runtime API, WinRT API)を使ってアプリ開発する際に逆引きとしてお使いください。