デスクトップ アプリケーションに対するサテライト アセンブリの作成Creating Satellite Assemblies for Desktop Apps

リソース ファイルはローカライズされたアプリケーションの中心的な役割を果たします。Resource files play a central role in localized applications. これを使用することで、アプリケーションでは、ユーザー固有の言語とカルチャで文字列、イメージ、およびその他のデータを表示し、ユーザー固有の言語またはカルチャ用のリソースが使用できない場合には代替データを提供できるようになります。They enable an application to display strings, images, and other data in the user's own language and culture, and to provide alternate data if resources for the user's own language or culture are unavailable. .NET Framework ではハブ アンド スポーク モデルを使用して、ローカライズされたリソースを見つけて取得します。The .NET Framework uses a hub-and-spoke model to locate and retrieve localized resources. ハブはニュートラルまたは既定のカルチャと呼ばれる、単一カルチャ用のリソースとローカライズできない実行可能コードを含むメイン アセンブリです。The hub is the main assembly that contains the non-localizable executable code and the resources for a single culture, which is called the neutral or default culture. 既定のカルチャはアプリケーションで使用されるフォールバック カルチャです。これは、ローカライズされたリソースが使用できない場合に使用されます。The default culture is the fallback culture for the application; it is used when no localized resources are available. アプリケーションの既定のカルチャにカルチャを指定するために NeutralResourcesLanguageAttribute 属性を使用します。You use the NeutralResourcesLanguageAttribute attribute to designate the culture of the application's default culture. 各スポークは、単一のローカライズされたカルチャ用のリソースを含むがコードは含まないサテライト アセンブリに接続します。Each spoke connects to a satellite assembly that contains the resources for a single localized culture but does not contain any code. サテライト アセンブリはメイン アセンブリには含まれないため、アプリケーションのメイン アセンブリを置換しなくても、特定のカルチャに対応するリソースを簡単に更新または置換できます。Because the satellite assemblies are not part of the main assembly, you can easily update or replace resources that correspond to a specific culture without replacing the main assembly for the application.

注意

アプリケーションの既定のカルチャのリソースは、サテライト アセンブリにも格納できます。The resources of an application's default culture can also be stored in a satellite assembly. これを行うには、NeutralResourcesLanguageAttribute 属性に UltimateResourceFallbackLocation.Satellite の値を割り当てます。To do this, you assign the NeutralResourcesLanguageAttribute attribute a value of UltimateResourceFallbackLocation.Satellite.

サテライト アセンブリの名前と場所Satellite Assembly Name and Location

ハブ アンド スポーク モデルでは、簡単に見つけて使用できるように、リソースを特定の場所に配置する必要があります。The hub-and-spoke model requires that you place resources in specific locations so that they can be easily located and used. リソースのコンパイルと名前の指定を適切に行わなかった場合や、リソースを適切な場所に配置しなかった場合、共通言語ランタイムはリソースを見つけることができず、代わりに既定のカルチャのリソースを使用します。If you do not compile and name resources as expected, or if you do not place them in the correct locations, the common language runtime will not be able to locate them and will use the resources of the default culture instead. ResourceManager オブジェクトによって表される .NET Framework リソース マネージャーは、ローカライズされたリソースに自動的にアクセスするために使用されます。The .NET Framework Resource Manager, represented by a ResourceManager object, is used to automatically access localized resources. リソース マネージャーでは以下が必要になります。The Resource Manager requires the following:

  • 単一のサテライト アセンブリには、特定のカルチャ用のリソースをすべて含める必要があります。A single satellite assembly must include all the resources for a particular culture. つまり、複数の .txt ファイルまたは .resx ファイルを単一のバイナリ .resources ファイルにコンパイルする必要があります。In other words, you should compile multiple .txt or .resx files into a single binary .resources file.

  • それぞれのローカライズされたカルチャ用のアプリケーション ディレクトリに個別のサブディレクトリが必要になります。ここには、そのカルチャのリソースが格納されます。There must be a separate subdirectory in the application directory for each localized culture that stores that culture's resources. サブディレクトリ名は、カルチャ名と同じである必要があります。The subdirectory name must be the same as the culture name. グローバル アセンブリ キャッシュにサテライト アセンブリを格納することもできます。Alternately, you can store your satellite assemblies in the global assembly cache. この場合、アセンブリの厳密な名前のカルチャ情報コンポーネントでそのカルチャを示す必要があります In this case, the culture information component of the assembly's strong name must indicate its culture. (このトピックの後半の「グローバル アセンブリ キャッシュへのサテライト アセンブリのインストール」セクションを参照してください)。(See the Installing Satellite Assemblies in the Global Assembly Cache section later in this topic.)

    注意

    アプリケーションにサブカルチャ用のリソースを含める場合は、アプリケーション ディレクトリの下の個別のサブディレクトリにそれぞれサブカルチャを配置します。If your application includes resources for subcultures, place each subculture in a separate subdirectory under the application directory. メイン カルチャのディレクトリの下のサブディレクトリにサブカルチャを配置しないでください。Do not place subcultures in subdirectories under their main culture's directory.

  • サテライト アセンブリはアプリケーションと同じ名前を持つ必要があり、ファイル名拡張子として ".resources.dll" を使用する必要があります。The satellite assembly must have the same name as the application, and must use the file name extension ".resources.dll". たとえば、アプリケーションが Example.exe という名前である場合、各サテライト アセンブリの名前は Example.resources.dll でなければなりません。For example, if an application is named Example.exe, the name of each satellite assembly should be Example.resources.dll. サテライト アセンブリ名は、リソース ファイルのカルチャを示していないことに注意してください。Note that the satellite assembly name does not indicate the culture of its resource files. ただし、サテライト アセンブリは、カルチャを指定するディレクトリに表示されます。However, the satellite assembly appears in a directory that does specify the culture.

  • サテライト アセンブリのカルチャに関する情報は、アセンブリのメタデータに含まれている必要があります。Information about the culture of the satellite assembly must be included in the assembly's metadata. サテライト アセンブリのメタデータにカルチャ名を格納するには、サテライト アセンブリにリソースを埋め込むために Assembly Linker を使用する際に /culture オプションを指定します。To store the culture name in the satellite assembly's metadata, you specify the /culture option when you use Assembly Linker to embed resources in the satellite assembly.

グローバル アセンブリ キャッシュ内にインストールしないアプリケーションについて、サンプルのディレクトリ構造と位置に関する要件を次の図に示します。The following illustration shows a sample directory structure and location requirements for applications that you are not installing in the global assembly cache. 拡張子が .txt および .resources の項目は、最終的なアプリケーションには付属していません。The items with .txt and .resources extensions will not ship with the final application. それらは、最終的なサテライト リソース アセンブリを作成するために使用する中間リソース ファイルです。These are the intermediate resource files used to create the final satellite resource assemblies. この例では、.txt ファイルを .resx ファイルに置き換えることができます。In this example, you could substitute .resx files for the .txt files. 詳細については、「リソースのパッケージ化と配置」を参照してください。For more information, see Packaging and Deploying Resources.

次の図は、サテライト アセンブリ ディレクトリを示しています。The following image shows the satellite assembly directory:

カルチャのサブディレクトリがローカライズされたサテライト アセンブリ ディレクトリ

コンパイル (サテライト アセンブリの)Compiling Satellite Assemblies

バイナリ .resources ファイルにリソースを含む XML ファイル (.resx) または、テキスト ファイルをコンパイルするために リソース ファイル ジェネレーター (Resgen.exe) を使用します。You use Resource File Generator (Resgen.exe) to compile text files or XML (.resx) files that contain resources to binary .resources files. その後、サテライト アセンブリに .resources ファイルをコンパイルするために アセンブリ リンカー (Al.exe) を使用します。You then use Assembly Linker (Al.exe) to compile .resources files into satellite assemblies. Al.exe は、指定された .resources ファイルからアセンブリを作成します。Al.exe creates an assembly from the .resources files that you specify. サテライト アセンブリにはリソースのみを含めることができます。実行可能コードを含めることはできません。Satellite assemblies can contain only resources; they cannot contain any executable code.

次の Al.exe コマンドでは、ドイツ語のリソース ファイル strings.de.resources からアプリケーション Example 用のサテライト アセンブリを作成します。The following Al.exe command creates a satellite assembly for the application Example from the German resources file strings.de.resources.

al -target:lib -embed:strings.de.resources -culture:de -out:Example.resources.dll  

また、次の Al.exe コマンドでは、ファイル strings.de.resources からアプリケーション Example 用のサテライト アセンブリを作成します。The following Al.exe command also creates a satellite assembly for the application Example from the file strings.de.resources. /template オプションを指定すると、サテライト アセンブリは親アセンブリ (Example.dll) のカルチャ情報を除き、すべてのアセンブリ メタデータを継承します。The /template option causes the satellite assembly to inherit all assembly metadata except for its culture information from the parent assembly (Example.dll).

al -target:lib -embed:strings.de.resources -culture:de -out:Example.resources.dll -template:Example.dll  

次の表では、これらのコマンドで使用する Al.exe オプションについてさらに詳しく説明します。The following table describes the Al.exe options used in these commands in more detail.

オプションOption 説明Description
/target: lib-target: lib サテライト アセンブリがライブラリ (.dll) ファイルにコンパイルされることを示します。Specifies that your satellite assembly is compiled to a library (.dll) file. サテライト アセンブリが実行可能コードを含まず、アプリケーションのメイン アセンブリではないため、サテライト アセンブリは DLL として保存する必要があります。Because a satellite assembly does not contain executable code and is not an application's main assembly, you must save satellite assemblies as DLLs.
/embed: strings.de.resources-embed: strings.de.resources Al.exe でのアセンブリのコンパイル時に埋め込むリソース ファイルの名前を指定します。Specifies the name of the resource file to embed when Al.exe compiles the assembly. サテライト アセンブリに複数の .resources ファイルを埋め込むことはできますが、ハブ アンド スポーク モデルに従う場合は、カルチャごとに 1 つのサテライト アセンブリをコンパイルする必要があります。You can embed multiple .resources files in a satellite assembly, but if you are following the hub-and-spoke model, you must compile one satellite assembly for each culture. ただし、文字列とオブジェクトに対して別の .resources ファイルを作成することができます。However, you can create separate .resources files for strings and objects.
/culture: de-culture: de コンパイルするリソースのカルチャを指定します。Specifies the culture of the resource to compile. 共通言語ランタイムは、指定されたカルチャ用のリソースを検索するときに、この情報を使用します。The common language runtime uses this information when it searches for the resources for a specified culture. このオプションを省略しても、Al.exe ではリソースがコンパイルされますが、ランタイムはユーザーからの要求時にリソースを見つけられなくなります。If you omit this option, Al.exe will still compile the resource, but the runtime will not be able to find it when a user requests it.
/out: Example.resources.dll-out: Example.resources.dll 出力ファイルの名前を指定します。Specifies the name of the output file. 名前は命名標準 baseName.resources.extension に従う必要があります。ここで、baseName はメイン アセンブリの名前、extension は有効なファイル名拡張子 (.dll など) です。The name must follow the naming standard baseName.resources.extension, where baseName is the name of the main assembly and extension is a valid file name extension (such as .dll). ランタイムは、出力ファイルの名前でサテライト アセンブリのカルチャを判断することはできないことに注意してください。/culture オプションを使用して指定する必要があります。Note that the runtime is not able to determine the culture of a satellite assembly based on its output file name; you must use the /culture option to specify it.
/template: Example.dll-template: Example.dll カルチャ フィールドを除く、すべてのアセンブリ メタデータをサテライト アセンブリが継承するアセンブリを指定します。Specifies an assembly from which the satellite assembly will inherit all assembly metadata except the culture field. このオプションがサテライト アセンブリに影響するのは、厳密な名前を持つアセンブリを指定する場合のみです。This option affects satellite assemblies only if you specify an assembly that has a strong name.

Al.exe で使用できるオプションの一覧については、「アセンブリ リンカー (Al.exe)」を参照してください。For a complete list of options available with Al.exe, see Assembly Linker (Al.exe).

サテライト アセンブリ:例Satellite Assemblies: An Example

ローカライズされたあいさつ文を含むメッセージ ボックスを表示する "Hello world" の簡単な例を以下に示します。The following is a simple "Hello world" example that displays a message box containing a localized greeting. この例には、英語 (米国)、フランス語 (フランス)、ロシア語 (ロシア) のカルチャ用のリソースが含まれており、そのフォールバック カルチャは英語です。The example includes resources for the English (United States), French (France), and Russian (Russia) cultures, and its fallback culture is English. 例を作成するには、次の手順を実行します。To create the example, do the following:

  1. 既定のカルチャのリソースを含める Greeting.resx または Greeting.txt という名前のリソース ファイルを作成します。Create a resource file named Greeting.resx or Greeting.txt to contain the resource for the default culture. 値が "Hello world!" の HelloString という名前の 1 つの文字列をStore a single string named HelloString whose value is "Hello world!" このファイルに格納します。in this file.

  2. 英語 (en) がアプリケーションの既定のカルチャであることを示すには、次の System.Resources.NeutralResourcesLanguageAttribute 属性をアプリケーションの AssemblyInfo ファイル、またはアプリケーションのメイン アセンブリにコンパイルされるメイン ソース コード ファイルに追加します。To indicate that English (en) is the application's default culture, add the following System.Resources.NeutralResourcesLanguageAttribute attribute to the application's AssemblyInfo file or to the main source code file that will be compiled into the application's main assembly.

    [assembly: NeutralResourcesLanguageAttribute("en")]
    
    <Assembly: NeutralResourcesLanguageAttribute("en")>
    
  3. 次のように、アプリケーションに他のカルチャ (en-US、fr-FR および ru-RU) のサポートを追加します。Add support for additional cultures (en-US, fr-FR, and ru-RU) to the application as follows:

    • en-US、つまり、英語 (米国) カルチャをサポートするには、Greeting.en-US.resx または Greeting.en-US.txt という名前のリソース ファイルを作成し、値が "Hi world!" の HelloString という名前の 1 つの文字列を格納します。To support the en-US or English (United States) culture, create a resource file named Greeting.en-US.resx or Greeting.en-US.txt, and store in it a single string named HelloString whose value is "Hi world!"

    • fr-FR、つまり、フランス語 (フランス) カルチャをサポートするには、Greeting.fr-FR.resx または Greeting.fr-FR.txt という名前のリソース ファイルを作成し、値が "Salut tout le monde!" の HelloString という名前の 1 つの文字列を格納します。To support the fr-FR or French (France) culture, create a resource file named Greeting.fr-FR.resx or Greeting.fr-FR.txt, and store in it a single string named HelloString whose value is "Salut tout le monde!"

    • ru-RU、つまり、ロシア語 (ロシア) カルチャをサポートするには、Greeting.ru-RU.resx または Greeting.ru-RU.txt という名前のリソース ファイルを作成し、値が "Всем привет!" の HelloString という名前の 1 つの文字列を格納します。To support the ru-RU or Russian (Russia) culture, create a resource file named Greeting.ru-RU.resx or Greeting.ru-RU.txt, and store in it a single string named HelloString whose value is "Всем привет!"

  4. Resgen.exe を使用して、バイナリ .resources ファイルに各テキストまたは XML リソース ファイルをコンパイルします。Use Resgen.exe to compile each text or XML resource file to a binary .resources file. 出力は、.resx ファイルまたは .txt ファイルと同じルート ファイル名を持つファイル セットです。ただし、拡張子は .resources になります。The output is a set of files that have the same root file name as the .resx or .txt files, but a .resources extension. Visual Studio で例を作成する場合は、コンパイル プロセスが自動的に処理されます。If you create the example with Visual Studio, the compilation process is handled automatically. Visual Studio を使用していない場合は、次のコマンドを実行して .resx ファイルを .resources ファイルにコンパイルします。If you aren't using Visual Studio, run the following commands to compile the .resx files into .resources files:

    resgen Greeting.resx  
    resgen Greeting.en-us.resx  
    resgen Greeting.fr-FR.resx  
    resgen Greeting.ru-RU.resx  
    

    リソースが XML ファイルではなく、テキスト ファイルにある場合は、.resx 拡張子を .txt に置き換えます。If your resources are in text files instead of XML files, replace the .resx extension with .txt.

  5. アプリケーションのメイン アセンブリに、既定のカルチャのリソースと一緒に次のソース コードをコンパイルします。Compile the following source code along with the resources for the default culture into the application's main assembly:

    重要

    Visual Studio ではなく、コマンド ラインを使用して例を作成する場合は、ResourceManager クラス コンストラクターの呼び出しを ResourceManager rm = new ResourceManager("Greetings", typeof(Example).Assembly); に変更する必要があります。If you are using the command line rather than Visual Studio to create the example, you should modify the call to the ResourceManager class constructor to the following: ResourceManager rm = new ResourceManager("Greetings", typeof(Example).Assembly);

    using System;
    using System.Globalization;
    using System.Reflection;
    using System.Resources;
    using System.Threading;
    using System.Windows.Forms;
    
    class Example
    {
       static void Main()
       {
          // Create array of supported cultures
          string[] cultures = {"en-CA", "en-US", "fr-FR", "ru-RU"};
          Random rnd = new Random();
          int cultureNdx = rnd.Next(0, cultures.Length);
          CultureInfo originalCulture = Thread.CurrentThread.CurrentCulture;
    
          try {
             CultureInfo newCulture = new CultureInfo(cultures[cultureNdx]);
             Thread.CurrentThread.CurrentCulture = newCulture;
             Thread.CurrentThread.CurrentUICulture = newCulture;
             ResourceManager rm = new ResourceManager("Example.Greetings", 
                                                      typeof(Example).Assembly); 
             string greeting = String.Format("The current culture is {0}.\n{1}",
                                             Thread.CurrentThread.CurrentUICulture.Name,
                                             rm.GetString("HelloString"));
    
             MessageBox.Show(greeting);
          }
          catch (CultureNotFoundException e) {
             Console.WriteLine("Unable to instantiate culture {0}", e.InvalidCultureName);
          }
          finally {
             Thread.CurrentThread.CurrentCulture = originalCulture;
             Thread.CurrentThread.CurrentUICulture = originalCulture;
          }
       }
    }
    
    Imports System.Globalization
    Imports System.Resources
    Imports System.Threading
    
    Module Module1
    
       Sub Main()
          ' Create array of supported cultures
          Dim cultures() As String = {"en-CA", "en-US", "fr-FR", "ru-RU" }
          Dim rnd As New Random()
          Dim cultureNdx As Integer = rnd.Next(0, cultures.Length)
          Dim originalCulture As CultureInfo = Thread.CurrentThread.CurrentCulture
    
          Try
             Dim newCulture As New CultureInfo(cultures(cultureNdx))
             Thread.CurrentThread.CurrentCulture = newCulture
             Thread.CurrentThread.CurrentUICulture = newCulture
             Dim greeting As String = String.Format("The current culture is {0}.{1}{2}",
                                                    Thread.CurrentThread.CurrentUICulture.Name,
                                                    vbCrLf, My.Resources.Greetings.HelloString)
    
             MsgBox(greeting)
          Catch e As CultureNotFoundException
             Console.WriteLine("Unable to instantiate culture {0}", e.InvalidCultureName)
          Finally
             Thread.CurrentThread.CurrentCulture = originalCulture
             Thread.CurrentThread.CurrentUICulture = originalCulture
          End Try
       End Sub
    End Module
    

    アプリケーションが Example という名前で、コマンド ラインからコンパイルする場合、C# コンパイラのコマンドは次のようになります。If the application is named Example and you are compiling from the command line, the command for the C# compiler is:

    csc Example.cs -res:Greeting.resources  
    

    対応する Visual Basic コンパイラのコマンドは次のようになります。The corresponding Visual Basic compiler command is:

    vbc Example.vb -res:Greeting.resources  
    
  6. アプリケーションでサポートされているそれぞれのローカライズされたカルチャのメイン アプリケーション ディレクトリに、サブディレクトリを作成します。Create a subdirectory in the main application directory for each localized culture supported by the application. en-US、fr-FR および ru-RU サブディレクトリを作成する必要があります。You should create an en-US, an fr-FR, and an ru-RU subdirectory. Visual Studio では、コンパイル プロセスの一環として、これらのサブディレクトリが自動的に作成されます。Visual Studio creates these subdirectories automatically as part of the compilation process.

  7. 個々のカルチャ固有の .resources ファイルをサテライト アセンブリに埋め込み、適切なディレクトリに保存します。Embed the individual culture-specific .resources files into satellite assemblies and save them to the appropriate directory. 各 .resources ファイルでこれを行う場合のコマンドは次のようになります。The command to do this for each .resources file is:

    al -target:lib -embed:Greeting.culture.resources -culture:culture -out:culture\Example.resources.dll  
    

    ここで、culture はリソースがサテライト アセンブリに含まれるカルチャの名前です。where culture is the name of the culture whose resources the satellite assembly contains. Visual Studio ではこのプロセスが自動的に処理されます。Visual Studio handles this process automatically.

その後、例を実行できます。You can then run the example. サポートされているカルチャのいずれかがランダムに選択され、現在のカルチャになり、ローカライズされたあいさつ文が表示されます。It will randomly make one of the supported cultures the current culture and display a localized greeting.

グローバル アセンブリ キャッシュへのサテライト アセンブリのインストールInstalling Satellite Assemblies in the Global Assembly Cache

ローカル アプリケーション サブディレクトリにアセンブリをインストールする代わりに、グローバル アセンブリ キャッシュにインストールすることができます。Instead of installing assemblies in a local application subdirectory, you can install them in the global assembly cache. これは、複数のアプリケーションで使用されるクラス ライブラリのリソース アセンブリとクラス ライブラリがある場合に特に便利です。This is particularly useful if you have class libraries and class library resource assemblies that are used by multiple applications.

アセンブリをグローバル アセンブリ キャッシュにインストールするには、アセンブリに厳密な名前が必要です。Installing assemblies in the global assembly cache requires that they have strong names. 厳密な名前のアセンブリには、有効な公開/秘密キーのペアで署名されます。Strong-named assemblies are signed with a valid public/private key pair. これらには、バインド要求を満たすために使用するアセンブリを判別するためにランタイムが使用するバージョン情報が含まれています。They contain version information that the runtime uses to determine which assembly to use to satisfy a binding request. 厳密な名前とバージョン管理の詳細については、「アセンブリのバージョン管理」を参照してください。For more information about strong names and versioning, see Assembly Versioning. 厳密な名前の詳細については、「厳密な名前付きアセンブリ」を参照してください。For more information about strong names, see Strong-Named Assemblies.

通常、アプリケーションの開発中に、最終的な公開/秘密キーのペアにアクセスすることはありません。When you are developing an application, it is unlikely that you will have access to the final public/private key pair. サテライト アセンブリをグローバル アセンブリ キャッシュ内にインストールし、そのアセンブリが確実に予期したとおりに機能するようにするために、遅延署名と呼ばれる技術を使用できます。In order to install a satellite assembly in the global assembly cache and ensure that it works as expected, you can use a technique called delayed signing. アセンブリに遅延署名する場合、厳密な名前による署名のために、ビルド時にファイル内のスペースを予約しておいてください。When you delay sign an assembly, at build time you reserve space in the file for the strong name signature. 実際の署名は、最終的な公開/秘密キーのペアが利用可能になるまで遅延されます。The actual signing is delayed until later, when the final public/private key pair is available. 遅延署名の詳細については、「アセンブリへの遅延署名」を参照してください。For more information about delayed signing, see Delay Signing an Assembly.

公開キーの取得Obtaining the Public Key

アセンブリに遅延署名するには、公開キーにアクセスする必要があります。To delay sign an assembly, you must have access to the public key. 実際の公開キーを取得するには、最終的な署名を行う社内の組織から取得するか、厳密な名前ツール (Sn.exe) を使用して公開キーを作成します。You can either obtain the real public key from the organization in your company that will do the eventual signing, or create a public key by using the Strong Name Tool (Sn.exe).

次の Sn.exe コマンドでは、テスト用の公開/秘密キーのペアを作成します。The following Sn.exe command creates a test public/private key pair. –k オプションは、Sn.exe で新しいキー ペアを作成し、TestKeyPair.snk という名前のファイルに格納するように指定します。The –k option specifies that Sn.exe should create a new key pair and save it in a file named TestKeyPair.snk.

sn –k TestKeyPair.snk   

テスト用のキー ペアを含むファイルから公開キーを抽出できます。You can extract the public key from the file that contains the test key pair. 次のコマンドでは、TestKeyPair.snk から公開キーを抽出し、PublicKey.snk に保存します。The following command extracts the public key from TestKeyPair.snk and saves it in PublicKey.snk:

sn –p TestKeyPair.snk PublicKey.snk  

アセンブリへの遅延署名Delay Signing an Assembly

公開キーを取得または作成したら、アセンブリ リンカー (Al.exe) を使用して、アセンブリをコンパイルし、遅延署名を指定します。After you obtain or create the public key, you use the Assembly Linker (Al.exe) to compile the assembly and specify delayed signing.

次の Al.exe コマンドでは、strings.ja.resources ファイルからアプリケーション StringLibrary 用の厳密な名前のサテライト アセンブリを作成します。The following Al.exe command creates a strong-named satellite assembly for the application StringLibrary from the strings.ja.resources file:

al -target:lib -embed:strings.ja.resources -culture:ja -out:StringLibrary.resources.dll -delay+ -keyfile:PublicKey.snk  

/delay+ オプションは、アセンブリ リンカーがアセンブリに遅延署名することを指定します。The -delay+ option specifies that the Assembly Linker should delay sign the assembly. /keyfile オプションは、アセンブリへの遅延署名のために使用する公開キーを含むキー ファイルの名前を指定します。The -keyfile option specifies the name of the key file that contains the public key to use to delay sign the assembly.

アセンブリへの再署名Re-signing an Assembly

アプリケーションを配置する前に、実際のキー ペアで遅延署名されたサテライト アセンブリに再署名する必要があります。Before you deploy your application, you must re-sign the delay signed satellite assembly with the real key pair. これは Sn.exe を使用して行うことができます。You can do this by using Sn.exe.

次の Sn.exe コマンドでは、ファイル RealKeyPair.snk に格納されているキーのペアで StringLibrary.resources.dll に署名します。The following Sn.exe command signs StringLibrary.resources.dll with the key pair stored in the file RealKeyPair.snk. –R オプションは、以前に署名または遅延署名されたアセンブリに再署名する必要があることを指定します。The –R option specifies that a previously signed or delay signed assembly is to be re-signed.

sn –R StringLibrary.resources.dll RealKeyPair.snk   

グローバル アセンブリ キャッシュへのサテライト アセンブリのインストールInstalling a Satellite Assembly in the Global Assembly Cache

ランタイムはリソース フォールバック プロセスでリソースを検索するときに、まず、グローバル アセンブリ キャッシュ内を調べます When the runtime searches for resources in the resource fallback process, it looks in the global assembly cache first. (詳細については、「リソースのパッケージ化と配置」トピックの「リソース フォールバック プロセス」セクションを参照してください)。サテライト アセンブリが厳密な名前で署名されたらすぐにグローバル アセンブリ キャッシュ ツール (Gacutil.exe) を使用して、グローバル アセンブリ キャッシュにインストールできます。(For more information, see the "Resource Fallback Process" section of the Packaging and Deploying Resources topic.) As soon as a satellite assembly is signed with a strong name, it can be installed in the global assembly cache by using the Global Assembly Cache Tool (Gacutil.exe).

次の Gacutil.exe コマンドでは、グローバル アセンブリ キャッシュに StringLibrary.resources.dll をインストールします。The following Gacutil.exe command installs StringLibrary.resources.dll in the global assembly cache:

gacutil -i:StringLibrary.resources.dll  

/i オプションは、Gacutil.exe でグローバル アセンブリ キャッシュに指定されたアセンブリをインストールする必要があることを指定します。The /i option specifies that Gacutil.exe should install the specified assembly into the global assembly cache. サテライト アセンブリがキャッシュにインストールされた後、中に含まれるリソースは、サテライト アセンブリを使用するようにデザインされたすべてのアプリケーションで使用できるようになります。After the satellite assembly is installed in the cache, the resources it contains become available to all applications that are designed to use the satellite assembly.

グローバル アセンブリ キャッシュのリソース:例Resources in the Global Assembly Cache: An Example

次の例では、.NET Framework クラス ライブラリのメソッドを使用して、リソース ファイルからローカライズされたあいさつ文を抽出して返します。The following example uses a method in a .NET Framework class library to extract and return a localized greeting from a resource file. ライブラリとそのリソースはグローバル アセンブリ キャッシュに登録されます。The library and its resources are registered in the global assembly cache. 例には、英語 (米国)、フランス語 (フランス)、ロシア語 (ロシア)、および英語カルチャ用のリソースが含まれています。The example includes resources for the English (United States), French (France), Russian (Russia), and English cultures. 英語は既定のカルチャです。そのリソースはメイン アセンブリに格納されます。English is the default culture; its resources are stored in the main assembly. この例では、最初に公開キーでライブラリとそのサテライト アセンブリに遅延署名してから、公開/秘密キーのペアで再署名します。The example initially delay signs the library and its satellite assemblies with a public key, then re-signs them with a public/private key pair. 例を作成するには、次の手順を実行します。To create the example, do the following:

  1. Visual Studio を使用していない場合は、次の厳密な名前ツール (Sn.exe) コマンドを使用して、ResKey.snk という名前の公開/秘密キーのペアを作成します。If you are not using Visual Studio, use the following Strong Name Tool (Sn.exe) command to create a public/private key pair named ResKey.snk:

    sn –k ResKey.snk  
    

    Visual Studio を使用している場合は、プロジェクトの [プロパティ] ダイアログ ボックスの [署名] タブを使用して、キー ファイルを生成します。If you are using Visual Studio, use the Signing tab of the project Properties dialog box to generate the key file.

  2. 次の厳密な名前ツール (Sn.exe) コマンドを使用して、PublicKey.snk という名前の公開キー ファイルを作成します。Use the following Strong Name Tool (Sn.exe) command to create a public key file named PublicKey.snk:

    sn –p ResKey.snk PublicKey.snk  
    
  3. 既定のカルチャのリソースを含める Strings.resx という名前のリソース ファイルを作成します。Create a resource file named Strings.resx to contain the resource for the default culture. 値が "How do you do?" の Greeting という名前の 1 つの文字列をStore a single string named Greeting whose value is "How do you do?" そのファイルに格納します。in that file.

  4. "en" がアプリケーションの既定のカルチャであることを示すには、次の System.Resources.NeutralResourcesLanguageAttribute 属性をアプリケーションの AssemblyInfo ファイル、またはアプリケーションのメイン アセンブリにコンパイルされるメイン ソース ファイルに追加します。To indicate that "en" is the application's default culture, add the following System.Resources.NeutralResourcesLanguageAttribute attribute to the application's AssemblyInfo file or to the main source code file that will be compiled into the application's main assembly:

    [assembly:NeutralResourcesLanguageAttribute("en")]
    
    <Assembly:NeutralResourcesLanguageAttribute("en")>
    
  5. 次のように、アプリケーションに他のカルチャ (en-US、fr-FR および ru-RU カルチャ) のサポートを追加します。Add support for additional cultures (the en-US, fr-FR, and ru-RU cultures) to the application as follows:

    • "en-US"、つまり、英語 (米国) カルチャをサポートするには、Strings.en-US.resx または Strings.en-US.txt という名前のリソース ファイルを作成し、値が "Hello!" の Greeting という名前の 1 つの文字列をそのファイルに格納します。To support the "en-US" or English (United States) culture, create a resource file named Strings.en-US.resx or Strings.en-US.txt, and store in it a single string named Greeting whose value is "Hello!".

    • "fr-FR"、つまり、フランス語 (フランス) カルチャをサポートするには、Strings.fr-FR.resx または Strings.fr-FR.txt という名前のリソース ファイルを作成し、値が "Bon jour!" の Greeting という名前の 1 つの文字列をそのファイルに格納します。To support the "fr-FR" or French (France) culture, create a resource file named Strings.fr-FR.resx or Strings.fr-FR.txt and store in it a single string named Greeting whose value is "Bon jour!"

    • "ru-RU"、つまり、ロシア語 (ロシア) カルチャをサポートするには、Strings.ru-RU.resx または Strings.ru-RU.txt という名前のリソース ファイルを作成し、値が "Привет!" の Greeting という名前の 1 つの文字列をそのファイルに格納します。To support the "ru-RU" or Russian (Russia) culture, create a resource file named Strings.ru-RU.resx or Strings.ru-RU.txt and store in it a single string named Greeting whose value is "Привет!"

  6. Resgen.exe を使用して、バイナリ .resources ファイルに各テキストまたは XML リソース ファイルをコンパイルします。Use Resgen.exe to compile each text or XML resource file to a binary .resources file. 出力は、.resx ファイルまたは .txt ファイルと同じルート ファイル名を持つファイル セットです。ただし、拡張子は .resources になります。The output is a set of files that have the same root file name as the .resx or .txt files, but a .resources extension. Visual Studio で例を作成する場合は、コンパイル プロセスが自動的に処理されます。If you create the example with Visual Studio, the compilation process is handled automatically. Visual Studio を使用していない場合は、次のコマンドを実行して .resx ファイルを .resources ファイルにコンパイルします。If you aren't using Visual Studio, run the following command to compile the .resx files into .resources files:

    resgen filename  
    

    ここで、filename は .resx ファイルまたはテキスト ファイルの省略可能なパス、ファイル名、および拡張子です。where filename is the optional path, file name, and extension of the .resx or text file.

  7. StringLibrary.dll という名前の遅延署名されたライブラリ アセンブリに、既定のカルチャのリソースと一緒に StringLibrary.vb または StringLibrary.cs の次のソース コードをコンパイルします。Compile the following source code for StringLibrary.vb or StringLibrary.cs along with the resources for the default culture into a delay signed library assembly named StringLibrary.dll:

    重要

    Visual Studio ではなく、コマンド ラインを使用して例を作成する場合は、ResourceManager クラス コンストラクターの呼び出しを ResourceManager rm = new ResourceManager("Strings", typeof(Example).Assembly); に変更する必要があります。If you are using the command line rather than Visual Studio to create the example, you should modify the call to the ResourceManager class constructor to ResourceManager rm = new ResourceManager("Strings", typeof(Example).Assembly);.

    using System;
    using System.Globalization;
    using System.Reflection;
    using System.Resources;
    using System.Threading;
    
    [assembly:NeutralResourcesLanguageAttribute("en")]
    
    public class StringLibrary
    {
       public string GetGreeting()
       {
          ResourceManager rm = new ResourceManager("Strings", 
                               Assembly.GetAssembly(typeof(StringLibrary)));
          string greeting = rm.GetString("Greeting");
          return greeting;
       }
    }
    
    Imports System.Globalization
    Imports System.Reflection
    Imports System.Resources
    Imports System.Threading
    
    <Assembly:NeutralResourcesLanguageAttribute("en")>
    
    Public Class StringLibrary
       Public Function GetGreeting() As String
          Dim rm As New ResourceManager("Strings", _
                                        Assembly.GetAssembly(GetType(StringLibrary)))
          Dim greeting As String = rm.GetString("Greeting")
          Return greeting
       End Function
    End Class
    

    C# コンパイラのコマンドは次のようになります。The command for the C# compiler is:

    csc -t:library -resource:Strings.resources -delaysign+ -keyfile:publickey.snk StringLibrary.cs  
    

    対応する Visual Basic コンパイラのコマンドは次のようになります。The corresponding Visual Basic compiler command is:

    vbc -t:library -resource:Strings.resources -delaysign+ -keyfile:publickey.snk StringLibrary.vb  
    
  8. アプリケーションでサポートされているそれぞれのローカライズされたカルチャのメイン アプリケーション ディレクトリに、サブディレクトリを作成します。Create a subdirectory in the main application directory for each localized culture supported by the application. en-US、fr-FR および ru-RU サブディレクトリを作成する必要があります。You should create an en-US, an fr-FR, and an ru-RU subdirectory. Visual Studio では、コンパイル プロセスの一環として、これらのサブディレクトリが自動的に作成されます。Visual Studio creates these subdirectories automatically as part of the compilation process. すべてのサテライト アセンブリが同じファイル名を持つため、公開/秘密キーのペアで署名されるまで個々のカルチャ固有のサテライト アセンブリを格納するためにはサブディレクトリが使用されます。Because all satellite assemblies have the same file name, the subdirectories are used to store individual culture-specific satellite assemblies until they are signed with a public/private key pair.

  9. 個々のカルチャ固有の .resources ファイルを遅延署名されたサテライト アセンブリに埋め込み、適切なディレクトリに保存します。Embed the individual culture-specific .resources files into delay signed satellite assemblies and save them to the appropriate directory. 各 .resources ファイルでこれを行う場合のコマンドは次のようになります。The command to do this for each .resources file is:

    al -target:lib -embed:Strings.culture.resources -culture:culture -out:culture\StringLibrary.resources.dll -delay+ -keyfile:publickey.snk  
    

    ここで、culture はカルチャの名前です。where culture is the name of a culture. この例では、カルチャ名は en-US、fr-FR、および ru-RU です。In this example, the culture names are en-US, fr-FR, and ru-RU.

  10. 次のように、厳密な名前ツール (Sn.exe) を使用して、StringLibrary.dll に再署名します。Re-sign StringLibrary.dll by using the Strong Name Tool (Sn.exe) as follows:

    sn –R StringLibrary.dll RealKeyPair.snk  
    
  11. 個々のサテライト アセンブリに再署名します。Re-sign the individual satellite assemblies. これを行うには、各サテライト アセンブリに対して、次のように厳密な名前ツール (Sn.exe) を使用します。To do this, use the Strong Name Tool (Sn.exe) as follows for each satellite assembly:

    sn –R StringLibrary.resources.dll RealKeyPair.snk  
    
  12. 次のコマンドを使用して、グローバル アセンブリ キャッシュに StringLibrary.dll とそのサテライト アセンブリをそれぞれ登録します。Register StringLibrary.dll and each of its satellite assemblies in the global assembly cache by using the following command:

    gacutil -i filename  
    

    ここで、filename は登録するファイルの名前です。where filename is the name of the file to register.

  13. Visual Studio を使用している場合は、Example という名前の新しいコンソール アプリケーション プロジェクトを作成し、StringLibrary.dll への参照と次のソース コードを追加してコンパイルします。If you are using Visual Studio, create a new Console Application project named Example, add a reference to StringLibrary.dll and the following source code to it, and compile.

    using System;
    using System.Globalization;
    using System.Threading;
    
    public class Example
    {
       public static void Main()
       {
          string[] cultureNames = { "en-GB", "en-US", "fr-FR", "ru-RU" };
          Random rnd = new Random();
          string cultureName = cultureNames[rnd.Next(0, cultureNames.Length)]; 
          Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(cultureName);
          Console.WriteLine("The current UI culture is {0}", 
                            Thread.CurrentThread.CurrentUICulture.Name);
          StringLibrary strLib = new StringLibrary();
          string greeting = strLib.GetGreeting();
          Console.WriteLine(greeting);
       }
    }
    
    Imports System.Globalization
    Imports System.Threading
    
    Module Example
       Public Sub Main()
          Dim cultureNames() As String = { "en-GB", "en-US", "fr-FR", "ru-RU" }
          Dim rnd As New Random()
          Dim cultureName As String = cultureNames(rnd.Next(0, cultureNames.Length)) 
          Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(cultureName)
          Console.WriteLine("The current UI culture is {0}", 
                            Thread.CurrentThread.CurrentUICulture.Name)
          Dim strLib As New StringLibrary()
          Dim greeting As String = strLib.GetGreeting()
          Console.WriteLine(greeting)
       End Sub
    End Module
    

    コマンド ラインからコンパイルするには、C# コンパイラの次のコマンドを使用します。To compile from the command line, use the following command for the C# compiler:

    csc Example.cs -r:StringLibrary.dll   
    

    Visual Basic コンパイラのコマンド ラインは次のとおりです。The command line for the Visual Basic compiler is:

    vbc Example.vb -r:StringLibrary.dll   
    
  14. Example.exe を実行します。Run Example.exe.

関連項目See also