[WPF]DLLにあるファイルへの参照方法

WPFでアプリケーションを作っていくと、意外に困るのが外部リソースへの参照方法です。罠があるなぁと思ったので、メモしておきます。

追記(12/6):外部リソース(DLL)側のファイルですが、ビルドアクションを「Resource」にしておくことをお忘れなく(Not「埋め込まれたリソース」)。「Resource」に設定しておかないと、以下の方法でアクセスできません。

今回は画像ファイルへのアクセスを例にしてコードを紹介します。
同じアセンブリ内での指定ではBitmapImageのSourceUriプロパティー指定を以下のようにします。
まずは絶対指定の場合。

var img = new BitmapImage(new Uri("pack://application:,,,/フォルダー/Test.png", UriKind.Absolute));

次に相対指定の場合。

var img = new BitmapImage(new Uri("フォルダー/Test.png", UriKind.Relative));

次に外部アセンブリ(DLL)への指定では次の通りにします。
まずは絶対指定の場合。

var img = new BitmapImage(new Uri("pack://application:,,,/外部リソースの名前空間;component/フォルダー/Test.png", UriKind.Absolute));
次に相対指定の場合。
var img = new BitmapImage(new Uri("/外部リソースの名前空間;component/フォルダー/Test.png", UriKind.Relative));

外部リソースへアクセスする場合、ポイントとなるのは紫字で書いた「外部リソース;component」という箇所。MSDNのリファレンスだと英語なのでついつい見落としがちです。相対指定の場合は、「UriKind.Relative」の指定も忘れずに。これがないとXamlParseException吐かれてアプリケーションが停止します。

例として、外部DLLの名前空間を「ClassLibrary1」、DLLに含まれる画像ファイルのパスが「Test/Event.png」となっている場合、絶対指定で書くと以下のようになります。

var img = new BitmapImage(new Uri("pack://application:,,,/ClassLibrary1;component/Test/Event.png", UriKind.Absolute));
皆さんの開発の参考になれば幸いです。

参考記事:WPFにおけるパッケージのURI(MSDNライブラリ)
http://msdn.microsoft.com/ja-jp/library/aa970069.aspx

コメントを残す