System.Resources.ResourceManager コンストラクター

この記事では、この API のリファレンス ドキュメントへの補足的な解説を提供します。

ResourceManager(Type) コンストラクター

このセクションは、コンストラクターのオーバーロードに ResourceManager(Type) 関連します。

デスクトップ アプリ

デスクトップ アプリでは、リソース マネージャーはパラメーターを resourceSource 使用して、次のように特定のリソース ファイルを読み込みます。

  • この属性を NeutralResourcesLanguageAttribute 使用して、既定のカルチャのリソースがサテライト アセンブリに存在することを示さない場合、リソース マネージャーは、既定のカルチャのリソース ファイルが、パラメーターで resourceSource 指定された型と同じアセンブリ内にあると見なします。
  • リソース マネージャーは、既定のリソース ファイルのベース名がパラメーターで resourceSource 指定された型と同じであることを前提としています。
  • リソース マネージャーは、既定 ResourceSet のクラスを使用してリソース ファイルを操作します。

たとえば、名前付きのMyCompany.MyProduct.MyType型を指定すると、リソース マネージャーは、定義するアセンブリ内の MyCompany.MyProduct.MyType.resources という名前の .resources ファイルを検索しますMyType

Visual Studio では、リソース デザイナーによって、既定のカルチャの .resources ファイルの基本名と同じ名前の (C#) クラスまたは Friend (Visual Basic の場合) クラスを定義internalするコードが自動的に生成されます。 これにより、クラスがコンパイラに表示されている限り、リソースも同様である必要があるため、リソースの名前に対応する名前を持つ型オブジェクトを取得することで、オブジェクトをインスタンス化 ResourceManager し、特定のリソース セットと結合することができます。 たとえば、.resources ファイルの名前が Resource1 の場合、次のステートメントは、Resource1 という名前の .resources ファイルを管理するオブジェクトをインスタンス化ResourceManagerします。

ResourceManager rm = new ResourceManager(typeof(Resource1));

Visual Studio を使用していない場合は、名前空間と名前が既定 の .resources ファイルと同じメンバーを持たないクラスを作成できます。 具体的な例を次に示します。

Windows 8.x アプリ

重要

この ResourceManager クラスは Windows 8.x アプリでサポートされていますが、その使用はお勧めしません。 このクラスは、Windows 8.x アプリで使用できるポータブル クラス ライブラリ プロジェクトを開発する場合にのみ使用します。 Windows 8.x アプリからリソースを取得するには、代わりに Windows.ApplicationModel.Resources.ResourceLoader クラスを使用します。

Windows 8.x アプリでは、 ResourceManager パラメーターを resourceSource 使用して、アセンブリ、ベース名、およびリソース項目がアプリのパッケージ リソース インデックス (PRI) ファイル内に配置できる名前空間を推測します。 たとえば、定義MyAssemblyされている名前のMyCompany.MyProduct.MyType型を指定すると、リソース マネージャーは名前付きのMyAssemblyリソース セット識別子を検索し、そのリソース セット内のスコープMyCompany.MyProduct.MyTypeを探します。 リソース マネージャーは、このスコープ内の既定のコンテキスト (現在のカルチャ、現在のハイ コントラスト設定など) でリソース項目を検索します。

次の例では、コンストラクターを ResourceManager(Type) 使用してオブジェクトを ResourceManager インスタンス化します。 これは、英語 (en)、フランス語 (フランス) (fr-FR)、およびロシア語 (ロシア) (ru-RU) の .txt ファイルからコンパイルされたリソースで構成されます。 例では、現在のカルチャと現在の UI カルチャを、英語 (米国)、フランス語 (フランス)、ロシア語 (ロシア)、およびスウェーデン語 (スウェーデン) に変更します。 その後、メソッドを GetString(String) 呼び出してローカライズされた文字列を取得します。これにより、時刻に応じてあいさつが表示されます。

この例では、次の表に示すように、3 つのテキスト ベースのリソース ファイルが必要です。 各ファイルには、、という名前 MorningAfternoon文字列リソースが Evening含まれています。

カルチャ ファイル名 リソース名 リソースの値
ja-JP GreetingResources.txt Morning おはようございます
ja-JP GreetingResources.txt Afternoon こんにちは
ja-JP GreetingResources.txt Evening こんばんは
fr-FR GreetingResources.fr-FR.txt Morning Bonjour
fr-FR GreetingResources.fr-FR.txt Afternoon Bonjour
fr-FR GreetingResources.fr-FR.txt Evening Bonsoir
ru-RU GreetingResources.ru-RU.txt Morning Доброе утро
ru-RU GreetingResources.ru-RU.txt Afternoon Добрый день
ru-RU GreetingResources.ru-RU.txt Evening Добрый вечер

次のバッチ ファイルを使用して、Visual Basic の例をコンパイルし、Greet.exeという名前の実行可能ファイルを作成できます。 C# を使用してコンパイルするには、コンパイラ名を to vbc からcsc変更し、ファイル拡張子を ..vb.cs

resgen GreetingResources.txt
vbc Greet.vb /resource: GreetingResources.resources

md fr-FR
resgen GreetingResources.fr-FR.txt
al /out:fr-FR\Greet.resources.dll /culture:fr-FR /embed: GreetingResources.fr-FR.resources

md ru-RU
resgen GreetingResources.ru-RU.txt
al /out:ru-RU\Greet.resources.dll /culture:ru-RU /embed: GreetingResources.ru-RU.resources

次に、この例のソース コード (Visual Basic バージョンの ShowDate.vb または C# バージョンの ShowDate.cs) を示します。

using System;
using System.Resources;
using System.Globalization;
using System.Threading;

[assembly: NeutralResourcesLanguage("en")]

public class Example2
{
    public static void Main()
    {
        string[] cultureNames = [ "en-US", "fr-FR", "ru-RU", "sv-SE" ];
        DateTime noon = new DateTime(DateTime.Now.Year, DateTime.Now.Month,
                                     DateTime.Now.Day, 12, 0, 0);
        DateTime evening = new DateTime(DateTime.Now.Year, DateTime.Now.Month,
                                        DateTime.Now.Day, 18, 0, 0);

        ResourceManager rm = new ResourceManager(typeof(GreetingResources));

        foreach (var cultureName in cultureNames)
        {
            Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(cultureName);
            Console.WriteLine("The current UI culture is {0}",
                              CultureInfo.CurrentUICulture.Name);
            if (DateTime.Now < noon)
                Console.WriteLine("{0}!", rm.GetString("Morning"));
            else if (DateTime.Now < evening)
                Console.WriteLine("{0}!", rm.GetString("Afternoon"));
            else
                Console.WriteLine("{0}!", rm.GetString("Evening"));
            Console.WriteLine();
        }
    }

    internal class GreetingResources
    {
    }
}
// The example displays output like the following:
//       The current UI culture is en-US
//       Good afternoon!
//
//       The current UI culture is fr-FR
//       Bonjour!
//
//       The current UI culture is ru-RU
//       Добрый день!
//
//       The current UI culture is sv-SE
//       Good afternoon!
Imports System.Resources
Imports System.Globalization
Imports System.Threading

<Assembly:NeutralResourcesLanguage("en")>

Module Example
   Public Sub Main()
      Dim cultureNames() As String = {"en-US", "fr-FR", "ru-RU", "sv-SE" }
      Dim noon As New Date(Date.Now.Year, Date.Now.Month, 
                           Date.Now.Day, 12,0,0)
      Dim evening As New Date(Date.Now.Year, Date.Now.Month,
                              Date.Now.Day, 18, 0, 0)                          
      
      Dim rm As New ResourceManager(GetType(GreetingResources))
      
      For Each cultureName In cultureNames
         Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(cultureName)
         Console.WriteLine("The current UI culture is {0}", 
                           CultureInfo.CurrentUICulture.Name)
         If Date.Now < noon Then
            Console.WriteLine("{0}!", rm.GetString("Morning"))
         ElseIf Date.Now < evening Then
            Console.WriteLine("{0}!", rm.GetString("Afternoon"))
         Else
            Console.WriteLine("{0}!", rm.GetString("Evening"))
         End If 
         Console.WriteLine()
      Next
   End Sub
End Module

Friend Class GreetingResources
End Class
' The example displays output like the following:
'       The current UI culture is en-US
'       Good afternoon!
'       
'       The current UI culture is fr-FR
'       Bonjour!
'       
'       The current UI culture is ru-RU
'       Добрый день!
'       
'       The current UI culture is sv-SE
'       Good afternoon!

ソース コードは、名前付きの Exampleアプリ クラスの定義に加えて、 GreetingResourcesリソース ファイルの基本名と同じ名前の内部クラスを定義します。 これにより、コンストラクターを呼び出ResourceManager(Type)してオブジェクトをResourceManager正常にインスタンス化できます。

現在の UI カルチャがスウェーデン語 (スウェーデン) の場合を除き、出力には適切なローカライズされた文字列が表示されます。この場合は、英語リソースが使用されます。 スウェーデン語の言語リソースは使用できないため、アプリは属性で定義されている既定のカルチャのリソースを NeutralResourcesLanguageAttribute 代わりに使用します。

ResourceManager(String, Assembly) コンストラクター

このセクションは、コンストラクターのオーバーロードに ResourceManager(String, Assembly) 関連します。

デスクトップ アプリ

デスクトップ アプリでは、個々のカルチャ固有のリソース ファイルをサテライト アセンブリに格納し、既定のカルチャのリソース ファイルを メイン アセンブリに含める必要があります。 サテライト アセンブリには、そのアセンブリのマニフェストで指定された 1 つのカルチャのリソースが含まれていると見なされ、必要に応じて読み込まれます。

Note

アセンブリから リソースを取得するのではなく、.resources ファイルから直接リソースを取得するには、代わりにメソッドを CreateFileBasedResourceManager 呼び出してオブジェクトを ResourceManager インスタンス化する必要があります。

で識別されたリソース ファイルが baseNameassemblyつからない場合、メソッドはオブジェクトを ResourceManager インスタンス化しますが、特定のリソースを取得しようとすると、通常 MissingManifestResourceExceptionは例外がスローされます。 例外の原因の診断については、クラス トピックの「MissingManifestResourceException 例外の処理」セクションを ResourceManager 参照してください。

Windows 8.x アプリ

重要

この ResourceManager クラスは Windows 8.x アプリでサポートされていますが、その使用はお勧めしません。 このクラスは、Windows 8.x アプリで使用できるポータブル クラス ライブラリ プロジェクトを開発する場合にのみ使用します。 Windows 8.x アプリからリソースを取得するには、代わりに Windows.ApplicationModel.Resources.ResourceLoader クラスを使用します。

Windows 8.x アプリでは、リソース マネージャーはパラメーターの単純な名前を assembly 使用して、アプリのパッケージ リソース インデックス (PRI) ファイル内の一致するリソース セットを検索します。 この baseName パラメーターは、リソース セット内のリソース項目を検索するために使用されます。 たとえば、PortableLibrary1.Resource1.de-DE.resources のルート名は PortableLibrary1.Resource1 です。

次の例では、単純なローカライズされていない "Hello World" アプリを使用してコンストラクターを ResourceManager(String, Assembly) 示します。 ExampleResources.txtという名前のテキスト ファイルの内容は次のとおりですGreeting=Hello アプリがコンパイルされると、リソースは メイン アプリ アセンブリに埋め込まれます。

テキスト ファイルは、コマンド プロンプトで次のようにリソース ファイル ジェネレーター (ResGen.exe) を使用してバイナリ リソース ファイルに変換できます。

resgen ExampleResources.txt

次の例では、オブジェクトをインスタンス化 ResourceManager し、ユーザーに名前の入力を求め、あいさつを表示する実行可能コードを示します。

using System;
using System.Reflection;
using System.Resources;

public class Example1
{
    public static void Main()
    {
        // Retrieve the resource.
        ResourceManager rm = new ResourceManager("ExampleResources",
                                 typeof(Example).Assembly);
        string greeting = rm.GetString("Greeting");

        Console.Write("Enter your name: ");
        string name = Console.ReadLine();
        Console.WriteLine("{0} {1}!", greeting, name);
    }
}
// The example produces output similar to the following:
//       Enter your name: John
//       Hello John!
Imports System.Globalization
Imports System.Reflection
Imports System.Resources

Module Example1
    Public Sub Main()
        ' Retrieve the resource.
        Dim rm As New ResourceManager("ExampleResources",
                                      GetType(Example).Assembly)
        Dim greeting As String = rm.GetString("Greeting")

        Console.Write("Enter your name: ")
        Dim name As String = Console.ReadLine()
        Console.WriteLine("{0} {1}!", greeting, name)
    End Sub
End Module
' The example produces output similar to the following:
'       Enter your name: John
'       Hello John!

これは、C# で次のコマンドを使用してコンパイルできます。

csc Example.cs /resource:ExampleResources.resources

この例では、リソース ファイルを含むアセンブリへの参照を取得します。そのアセンブリ typeof で定義されている型を関数 (C#) または GetType 関数 (Visual Basic の場合) に渡し、その Type.Assembly プロパティの値を取得します。