リソース

リソースの種類

リソース 対象データ 格納時の型
文字列 文字列 String
イメージ .bmp、.jpgなどのイメージファイル Bitmap
アイコン .icoファイル Icon
オーディオ .wav、.mp3などのサウンドファイル byte[]
ファイル 上記以外のファイル ファイルのFileTypeによって異なる
  • Text … String
  • Binary … byte[]
(格納後、リソースのプロパティから変更できる)
その他 文字列シリアル化をサポートするその他のデータ  
[リソース] ページ (プロジェクト デザイナー) | MSDN

文字列

ローカライズのためにリソースで管理すべき文字列は、コード分析CA1303「ローカライズされたパラメーターとしてリテラルを渡さないでください (Do not pass literals as localized parameters)」で検出できます。

リソースの追加方法

C#では、Visual Studioでプロジェクトのプロパティを開き、それの[リソース]タブから各種のリソースを追加できます。方法 : リソースを追加または削除する | MSDN

そのとき[リソースの追加]右の矢印からドロップダウンを開くか、このリソースのウィンドウへファイルをドロップすることで、既存のファイルを追加できます。

プロジェクトに追加したリソースは、プロジェクトのResourcesディレクトリに置かれます。そのとき既存のファイルを追加したならば、それがコピーされて置かれます。

既存のリソースを追加した場合、プロジェクトに格納されるのはそれのコピーです。よってリソースを編集するときは、プロジェクト内のResourcesディレクトリにあるファイルを編集します。

リソース エクスプローラー

Resources.resxを開くと、そのリソース ファイルがリソース エクスプローラーで表示されます。

リソース エクスプローラーでファイルを追加すると、「error MSB3103: ResX ファイルが無効です。パス '***\Project\Properties\Resources\sample.txt' の一部が見つかりませんでした。」としてエラーとなることがあります。これはパスが誤っているためで、実際にはProject\Resources\sample.txtの位置に配置されます。

リソースファイルへの格納方法

格納方法 リソースファイルに格納される情報
リンクリソース
(Linked Resources)
ファイルへのリンク [既定]

(コンパイル時にリンク先からデータが取得され、アプリケーションのマニフェストに格納される)

埋め込みリソース
(Embedded Resources)
ファイルの内容をバイナリデータとして表したテキスト
リンク リソースと埋め込みリソース | MSDN

リソースファイル (.resx) への格納方法は、リソースの[Persistence]プロパティから変更できます。それにはプロジェクトのプロパティの[リソース]タブで対象のリソースを選択し、メニューの【表示 → プロパティ ウィンドウ】からプロパティを表示します。

テキストファイル

テキストと認識されないテキストファイルは、byte配列で格納されます。これはリソースのプロパティ ウィンドウで、[FileType]をTextとすることで解消できます。

またテキストのエンコーディングが設定と一致していないと文字化けするため、プロパティの[Encoding]を確認します。このエンコーディングの指定はProperties\Resources.Designer.csでのリソースの定義の<summary>に反映され、Properties\Resources.resxでのリソースへのリンクの末尾に;shift_jis</value>のように設定されます。

文化固有のリソース

filename.ja-JP.resxのように、BCP 47 (RFC 4646) の文字列を拡張子の前に付加してファイルを作成します。そうするとプロジェクトをビルドしたときにja-JP\project_name.resources.dllの名前で、リソースの情報が格納されたファイルが作成されます。

実行時にそのカルチャがja-JPならば、このファイルがja-JPのフォルダ内に配置されていることで読み込まれます。どのカルチャが用いられるかは、CurrentThread.CurrentUICultureによって決定されます。

リソースの取得方法

Visual Studioでリソースを追加すると、プロジェクトの名前空間にResourcesクラスが自動で生成されます。

/// <summary>
///   ローカライズされた文字列などを検索するための、厳密に型指定されたリソース クラスです。
/// </summary>
[global::System.CodeDom.Compiler.GenedratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {

    /// <summary>
    ///   ABC に類似しているローカライズされた文字列を検索します。
    /// </summary>
    internal static string String1 {
        get {
            return ResourceManager.GetString("String1", resourceCulture);
        }
    }

そしてそのリソースは、そのクラスのプロパティを介して取得できます。

string string1   = Namespace.Properties.Resources.String1;   // 文字列
Bitmap bitmap1   = Namespace.Properties.Resources.Image1;    // イメージ
string textFile1 = Namespace.Properties.Resources.TextFile1; // ファイル

イメージ

システムアイコン

システムリソース

VisualStyleRenderer renderer = new VisualStyleRenderer(VisualStyleElement.Header.SortArrow.SortedUp);
renderer.DrawBackground(e.Graphics, new Rectangle(0, 0, 100, 10));
VisualStyleElement.Header.SortArrow クラス (System.Windows.Forms.VisualStyles) | Microsoft Learn

.resx リソース ファイルの形式

Form1.resx

フォーム (Form1) にボタン (button1) を配置してLocalizableをtrueとすると、次のようなリソースファイルが作成されます。

名前
$this.Text Form1
>>$this.Name Form1
>>$this.Type System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
>>button1.Name button1
>>button1.Parent $this
>>button1.Type System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
>>button1.ZOrder 0
button1.Text button1

この実体はXMLで、次のように記述されます。

<?xml version="1.0" encoding="utf-8"?>
<root>
  ...
  <data name="$this.Text" xml:space="preserve">
    <value>Form1</value>
  </data>
  <data name="&gt;&gt;$this.Name" xml:space="preserve">
    <value>Form1</value>
  </data>
  ...
  <data name="&gt;&gt;button1.Name" xml:space="preserve">
    <value>button1</value>
  </data>
  <data name="&gt;&gt;button1.Parent" xml:space="preserve">
    <value>$this</value>
  </data>
  ...
  <data name="button1.Text" xml:space="preserve">
    <value>button1</value>
  </data>
</root>

Form1.ja.resx

フォームのLanguageを日本語 (ja) としてボタンのTextを"ボタン1"とすると、次のようなリソースファイルが作成されます。

名前
button1.Text ボタン1

この実体はXMLで、次のように記述されます。

<?xml version="1.0" encoding="utf-8"?>
<root>
  ...
  <data name="button1.Text" xml:space="preserve">
    <value>ボタン1</value>
  </data>
</root>

参考

参考書

Microsoft Learnから検索