次の方法で共有


文字列リソース

文字列リソースを作成するには、次の 3 つの手順を実行するだけです。

  1. 各文字列の名前と値のエントリを含むテキスト ファイルを作成します。

  2. Resgen.exe を使用して、このテキスト ファイルを .resources ファイルに変換します。

  3. DLL を作成し、アセンブリ生成ツール (AL) または .NET Framework SDK に付属する言語コンパイラの 1 つを使用して、.resources ファイルを埋め込みます。

    **メモ   **AL の詳細については、「付録 B : リソース ツール」を参照してください。

文字列が既定以外のカルチャにローカライズされる場合は、各カルチャおよび言語に依存しない既定のカルチャについて、上記の 3 つの手順を実行する必要があります。また、AL の使用時にカルチャを指定する必要もあります。

リスト 1. 文字列テキスト ファイルのサンプル (MyStrings.txt)

; Sample strings for the calculator – Default locale
;
Math_Greeting = Welcome – Integer Calculator
Math_Formula_Label = Formula and Results:
Math_Clear_Button = Clear
Math_Calc_Button = Calculate
Math_Calc_Error = Invalid Formula. Please try again.

Resgen.exe は、文字列リソース (.txt ファイル)、XML リソース (.resx ファイル)、コンパイル済みリソース (.resources ファイル) の 3 種類のリソース ファイル形式を相互に変換します。MyStrings.txt リソース ファイルをコンパイルするには、次のコマンド ラインを実行して、複数のリソースを含むコンパイル済みの中間ファイルを生成します。

resgen MyStrings.txt MyStrings.resources

この時点で、パッケージ化の方法は 3 つあります。つまり、実行可能アセンブリにリソースを埋め込む方法、リソースを保持するだけのサテライト アセンブリを作成する方法、.resources ファイルにリソースを残して直接アクセスする方法です。最後の方法は、主にツールを作成するときには便利ですが、本格的なアプリケーションでは、アセンブリを使用して署名とバージョン チェックの利点を生かすことをお勧めします。

多くのアプリケーション (特にローカライズされないアプリケーション) では、実行可能アセンブリにリソースを埋め込むだけで十分です。この埋め込みは、/res スイッチと次の構文を使用してコンパイル時に行います。

(csc|vbc) ... /out:WorldCalc.exe /res:MyStrings.resources WorldCalc.cs

メモ   理解しやすいように、上記のコマンド ラインでは /target/addmodule/a/r の各パラメータは省略してあります。

このコマンド ラインは、WorldCalc.cs を WorldCalc.exe にコンパイルし、MyStrings.resources ファイルからリソースを埋め込みます。リソースを別の DLL に入れる場合は、たとえば次のコマンド ラインを使用できます。

al /out:WorldCalc.Resources.DLL /embed:MyStrings.resources,MyStrings.resources,Private

/embed パラメータの構文は次のとおりです。

/embed:<filename>[,<name>[,Private]

各パラメータの説明を次に示します。

  • <filename> - .resources ファイルの名前です。

  • <name> - リソースの内部名です。通常は ResourceManager を構築するときに使われます。一般には名前空間が含まれます。

  • Private - リソースが他のアセンブリから参照できるかどうかを指定します (既定値は no です)。

    ****メモ   /embed の代わりに /link パラメータを使うこともできます。この場合は、マニフェストを含むリソース アセンブリ DLL がビルドされますが、リソース自体が埋め込まれるのではなく、.resources ファイルへのリンクが格納されます。

コードによるリソースの作成

コードを使用すると、.resource ファイルを直接作成できます。この方法は、適切に書式設定されたリソースの生成を自動化するとき、特に、リソースがデータベースに格納されている場合や、以前の Win32 文字列リソース テーブルのような別のシステムからリソースを移行した場合に便利です。.resources ファイルを作成するには、一意のファイル名で ResourceWriter を作成し、AddResource を少なくとも 1 回呼び出し、Close を呼び出してファイルを閉じます (Close によって暗黙的に Generate が呼び出されます)。ResourceWriter を使用して 5 つのエントリを含む .resources ファイルを作成する方法を、次の小さなプログラムとして示します。

リスト 2a..resource ファイルの作成と読み取り (ResWrite.cs)

using System;
using System.Collections;
using System.Resources;

class MainApp {
   public static void Main() {
      // First create the resource file and add strings.
      IResourceWriter rw = new ResourceWriter("sample.resources");
      rw.AddResource("test1", "one");
      rw.AddResource("test2", "two");
      rw.AddResource("test3", "three");
      rw.AddResource("test4", "four");
      rw.AddResource("test5", 512341234);
      rw.Close();
      ...
   }
}

リスト 2b..resource ファイルの作成と読み取り (ResWrite.vb)

Imports System
Imports System.Collections
Imports System.Resources

Class MainApp
    
   Public Shared Sub Main()
      ' First create the resource file and add strings.
      Dim rw As ResourceWriter = New ResourceWriter("sample.resources")
      rw.AddResource("test1", "one")
      rw.AddResource("test2", "two")
      rw.AddResource("test3", "three")
      rw.AddResource("test4", "four")
      rw.AddResource("test5", 512341234)
      rw.Close()
      ...
   End Sub
End Class

**メモ   **同じインターフェイスをサポートする他の ResourceWriter クラスでもコードが正しく動作するように、これを IResourceWriter に割り当てる必要があります。

ファイルからリソースを取得する最も簡単な方法は、ResourceReader クラスを使用してリソースを反復処理することです。前のコードに基づいて、書き込まれたリソースを列挙するために必要な最小限のコードを次に示します (リソースは、同じ ResWrite.cs プログラム ファイルや ResWrite.vb プログラム ファイルから取得されます)。

リスト 3a.ResourceReader による反復処理 (ResWrite.cs)

      ...
      // Iterate through the resources.
      IResourceReader rr = new ResourceReader("sample.resources");
      IDictionaryEnumerator de = rr.GetEnumerator();
      while (de.MoveNext()) {
            Console.WriteLine(de.Key + " " + de.Value);
      }
      rr.Close();
      ...

リスト 3a.ResourceReader による反復処理 (ResWrite.vb)

      ...
      ' Iterate through the resources.
      Dim rr As ResourceReader = New ResourceReader("sample.resources")
      Dim de As IDictionaryEnumerator = rr.GetEnumerator()
      While de.MoveNext()
         Console.WriteLine((de.Key.ToString() + " " + de.Value.ToString()))
      End While
      rr.Close()
      ...

この小さなプログラムでは、まず、前に作成したのと同じ .resources ファイル用の ResourceReader を作成しています。リソースを書き込んだときと同様に、これを IResourceReader に割り当てて柔軟性を高めています。次に、DictionaryEnumerator を使用してリソースを反復処理し、リソース名とそれに対応する値をコンソールに出力します。

ResourceReader を直接使用した場合もリソースを列挙できますが、名前付きエントリを指定して固有のリソースを直接取得することはできません。セクション「コードによるリソースの取得」で説明する強力な ResourceManager を使用すると、リソースを直接取得できます。

参照

イメージ リソース | リソースのパッケージ化 | コードによるリソースの取得 | リソースのまとめ | 付録 A : リソースに関する追加情報 | 付録 B : リソース ツール