mikeo_410


Silverlightのマニフェスト・リソース

  Visual Studio のファイルの「ビルドアクション」には、「埋め込まれたリソース」と「Resource」があります。違いを理解しようと以下の実験をして見ました。 

  まず、4つのテキストファイルを用意して、プロジェクトに追加します。
  内容は、以下のような文字列を入れて置きました。

  1. これは、ビルドアクションに「組み込まれたリソース」を設定してあります。
  2. プロジェクトのトップにあります。

  下図の「ソリューション・エクスプローラ」の表示のように配置します。 

ソリューション・エクスプローラ ファイルのプロパティ

  ルートと resource1と言うディレクトリの下の2か所に2つずつ置きます。
  それそれ、1つずつ、「埋め込まれたリソース」と「Resource」に設定します。

  下のプログラムで、GetManifestResourceNames()などを使って中身を見ます。

  1. using System.Windows;
  2. using System.Windows.Controls;
  3. using System.Reflection;
  4. using System.IO;
  5. using System.Resources;
  6. namespace sla_resource_test
  7. {
  8.     public partial class MainPage : UserControl
  9.     {
  10.         public MainPage()
  11.         {
  12.             InitializeComponent();
  13.         }
  14.         private void LayoutRoot_Loaded(object sender, RoutedEventArgs e)
  15.         {
  16.             listbox1.Items.Add("-----------------------------------------------");
  17.             listbox1.Items.Add("実行中のアセンブリの GetManifestResourceNames()");
  18.             Assembly asm = Assembly.GetExecutingAssembly();
  19.             string[] sa = asm.GetManifestResourceNames();
  20.             foreach (string s in sa)
  21.                 listbox1.Items.Add(s);
  22.             listbox1.Items.Add("-----------------------------------------------");
  23.             listbox1.Items.Add("各リソースの内容");
  24.             foreach (string s in sa)
  25.             {
  26.                 Stream stream = asm.GetManifestResourceStream(s);
  27.                 listbox1.Items.Add(s);
  28.                 listbox1.Items.Add((new StreamReader(stream)).ReadToEnd());
  29.             }
  30.             listbox1.Items.Add("-----------------------------------------------");
  31.             listbox1.Items.Add("sla_resource_test.gの内容");
  32.             string[] names = new string[] { "resource_resource.txt", 
  33.                                             "resource1/resource_resource_subdir.txt" };
  34.             ResourceManager rm = new ResourceManager("sla_resource_test.g", asm);
  35.             foreach (string name in names)
  36.             {
  37.                 Stream stream = rm.GetStream(name);
  38.                 listbox1.Items.Add(name);
  39.                 listbox1.Items.Add((new StreamReader(stream)).ReadToEnd());
  40.             }
  41.         }
  42.     }
  43. }

 プログラムの実行結果です。 


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


市川市 新築 習志野市 新築 横浜 不動産 美容外科 札幌 東戸塚 マンション