Silverlightのマニフェスト・リソース
Visual Studio のファイルの「ビルドアクション」には、「埋め込まれたリソース」と「Resource」があります。違いを理解しようと以下の実験をして見ました。
まず、4つのテキストファイルを用意して、プロジェクトに追加します。
内容は、以下のような文字列を入れて置きました。
- これは、ビルドアクションに「組み込まれたリソース」を設定してあります。
- プロジェクトのトップにあります。
下図の「ソリューション・エクスプローラ」の表示のように配置します。
| ソリューション・エクスプローラ |
ファイルのプロパティ |
|

|

|
ルートと resource1と言うディレクトリの下の2か所に2つずつ置きます。
それそれ、1つずつ、「埋め込まれたリソース」と「Resource」に設定します。
下のプログラムで、GetManifestResourceNames()などを使って中身を見ます。
- using System.Windows;
- using System.Windows.Controls;
- using System.Reflection;
- using System.IO;
- using System.Resources;
- namespace sla_resource_test
- {
- public partial class MainPage : UserControl
- {
- public MainPage()
- {
- InitializeComponent();
- }
- private void LayoutRoot_Loaded(object sender, RoutedEventArgs e)
- {
- listbox1.Items.Add("-----------------------------------------------");
- listbox1.Items.Add("実行中のアセンブリの GetManifestResourceNames()");
- Assembly asm = Assembly.GetExecutingAssembly();
- string[] sa = asm.GetManifestResourceNames();
- foreach (string s in sa)
- listbox1.Items.Add(s);
- listbox1.Items.Add("-----------------------------------------------");
- listbox1.Items.Add("各リソースの内容");
- foreach (string s in sa)
- {
- Stream stream = asm.GetManifestResourceStream(s);
- listbox1.Items.Add(s);
- listbox1.Items.Add((new StreamReader(stream)).ReadToEnd());
- }
- listbox1.Items.Add("-----------------------------------------------");
- listbox1.Items.Add("sla_resource_test.gの内容");
- string[] names = new string[] { "resource_resource.txt",
- "resource1/resource_resource_subdir.txt" };
- ResourceManager rm = new ResourceManager("sla_resource_test.g", asm);
- foreach (string name in names)
- {
- Stream stream = rm.GetStream(name);
- listbox1.Items.Add(name);
- listbox1.Items.Add((new StreamReader(stream)).ReadToEnd());
- }
- }
- }
- }
プログラムの実行結果です。

「埋め込まれたリソース」は、一覧を取得でき、"名前空間[[.ディレクトリ名]..].ファイル名" で読み出せます。
「Resource」の方は、一覧に名前がありません。名前空間.g.resources にまとめられているようです。
これは一覧できませんが、上のプログラムのように名前を知っていれば、ResourceManager を使ってアクセスできます。
|