Création d'assemblys satellites pour les applications bureautiquesCreating Satellite Assemblies for Desktop Apps

Les fichiers de ressources jouent un rôle central dans les applications localisées.Resource files play a central role in localized applications. Ils permettent à une application d’afficher des chaînes, des images et d’autres données dans la langue et la culture de l’utilisateur, et de fournir des données de remplacement si les ressources relatives à la langue et la culture de l’utilisateur ne sont pas disponibles.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. Le .NET Framework utilise un modèle Hub and Spoke pour localiser et récupérer les ressources localisées.The .NET Framework uses a hub-and-spoke model to locate and retrieve localized resources. Le hub est l’assembly principal qui contient le code exécutable non localisable et les ressources pour une culture unique, appelée culture neutre ou par défaut.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. La culture par défaut est la culture de secours de l’application ; elle est utilisée quand aucune ressource localisée n’est disponible.The default culture is the fallback culture for the application; it is used when no localized resources are available. Vous utilisez l’attribut NeutralResourcesLanguageAttribute pour désigner la culture de la culture par défaut de l’application.You use the NeutralResourcesLanguageAttribute attribute to designate the culture of the application's default culture. Chaque spoke se connecte à un assembly satellite qui contient les ressources d’une culture localisée unique, mais ne contient pas de code.Each spoke connects to a satellite assembly that contains the resources for a single localized culture but does not contain any code. Dans la mesure où les assemblys satellites ne font pas partie de l’assembly principal, vous pouvez facilement remplacer ou mettre à jour les ressources correspondant à une culture spécifique sans remplacer l’assembly principal de l’application.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.

Notes

Les ressources de la culture par défaut d’une application peuvent aussi être stockées dans un assembly satellite.The resources of an application's default culture can also be stored in a satellite assembly. Pour cela, vous affectez à l’attribut NeutralResourcesLanguageAttribute la valeur UltimateResourceFallbackLocation.Satellite.To do this, you assign the NeutralResourcesLanguageAttribute attribute a value of UltimateResourceFallbackLocation.Satellite.

Nom et emplacement de l’assembly satelliteSatellite Assembly Name and Location

Le modèle Hub and Spoke nécessite que vous placiez les ressources à des emplacements spécifiques afin qu’elles soient facilement trouvées et utilisées.The hub-and-spoke model requires that you place resources in specific locations so that they can be easily located and used. Si vous ne compilez pas et ne nommez pas les ressources comme prévu ou si vous ne les placez pas aux endroits corrects, le Common Language Runtime ne sera pas en mesure de les trouver et utilisera les ressources de la culture par défaut à la place.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. Le gestionnaire des ressources du .NET Framework, représenté par un objet ResourceManager, permet d’accéder automatiquement aux ressources localisées.The .NET Framework Resource Manager, represented by a ResourceManager object, is used to automatically access localized resources. Le gestionnaire des ressources nécessite les éléments suivants :The Resource Manager requires the following:

  • Un seul assembly satellite doit inclure toutes les ressources d’une culture particulière.A single satellite assembly must include all the resources for a particular culture. En d’autres termes, vous devez compiler plusieurs fichiers . txt ou . resx en un seul fichier . Resources binaire.In other words, you should compile multiple .txt or .resx files into a single binary .resources file.

  • Il doit exister un sous-répertoire distinct dans le répertoire de l’application pour chaque culture localisée qui stocke les ressources de cette culture.There must be a separate subdirectory in the application directory for each localized culture that stores that culture's resources. Le nom du sous-répertoire doit être identique au nom de la culture.The subdirectory name must be the same as the culture name. Vous pouvez aussi stocker vos assemblys satellites dans le Global Assembly Cache.Alternately, you can store your satellite assemblies in the global assembly cache. Dans ce cas, le composant des informations de culture du nom fort de l’assembly doit indiquer sa culture.In this case, the culture information component of the assembly's strong name must indicate its culture. (Consultez la section Installation d’assemblys satellites dans le Global Assembly Cache plus loin dans cette rubrique.)(See the Installing Satellite Assemblies in the Global Assembly Cache section later in this topic.)

    Notes

    Si votre application comporte des ressources pour les sous-cultures, placez chaque sous-culture dans un sous-répertoire distinct sous le répertoire de l’application.If your application includes resources for subcultures, place each subculture in a separate subdirectory under the application directory. Ne placez pas les sous-cultures dans des sous-répertoires sous le répertoire de leur culture principale.Do not place subcultures in subdirectories under their main culture's directory.

  • L’assembly satellite doit avoir le même nom que l’application et doit utiliser l’extension de nom de fichier « . resources.dll ».The satellite assembly must have the same name as the application, and must use the file name extension ".resources.dll". Par exemple, si une application est nommée example. exe, le nom de chaque assembly satellite doit être example. resources. dll.For example, if an application is named Example.exe, the name of each satellite assembly should be Example.resources.dll. Notez que le nom de l’assembly satellite n’indique pas la culture de ses fichiers de ressources.Note that the satellite assembly name does not indicate the culture of its resource files. Toutefois, l’assembly satellite apparaît dans un répertoire qui spécifie la culture.However, the satellite assembly appears in a directory that does specify the culture.

  • Des informations sur la culture de l’assembly satellite doivent être incluses dans les métadonnées de l’assembly.Information about the culture of the satellite assembly must be included in the assembly's metadata. Pour stocker le nom de culture dans les métadonnées de l’assembly satellite, vous spécifiez l’option /culture quand vous utilisez Assembly Linker pour incorporer des ressources dans l’assembly satellite.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.

L’illustration suivante propose un exemple de structure de répertoires et de la configuration requise pour les emplacements des applications que vous n’installez pas dans le Global Assembly Cache.The following illustration shows a sample directory structure and location requirements for applications that you are not installing in the global assembly cache. Les éléments avec les extensions .txt et .resources ne sont pas fournis avec l’application finale.The items with .txt and .resources extensions will not ship with the final application. Il s’agit des fichiers de ressources intermédiaires utilisés pour créer les assemblys de ressources satellites finaux.These are the intermediate resource files used to create the final satellite resource assemblies. Dans cet exemple, vous pouvez remplacer les fichiers .txt par les fichiers .resx.In this example, you could substitute .resx files for the .txt files. Pour plus d’informations, consultez Empaquetage et déploiement de ressources.For more information, see Packaging and Deploying Resources.

L’illustration suivante montre le répertoire d’assemblys satellites :The following image shows the satellite assembly directory:

Répertoire d’assemblys satellites avec sous-répertoires de cultures localisées.

compiler des assemblys satellitesCompiling Satellite Assemblies

Le générateur de fichiers de ressources (Resgen. exe) vous permet de compiler des fichiers texte ou des fichiers XML ( . resx) contenant des ressources dans des fichiers . Resources binaires.You use Resource File Generator (Resgen.exe) to compile text files or XML (.resx) files that contain resources to binary .resources files. Vous utilisez ensuite Assembly Linker (al. exe) pour compiler les fichiers . Resources en assemblys satellites.You then use Assembly Linker (Al.exe) to compile .resources files into satellite assemblies. Al. exe crée un assembly à partir des fichiers . Resources que vous spécifiez.Al.exe creates an assembly from the .resources files that you specify. Les assemblys satellites ne peuvent contenir que des ressources ; ils ne peuvent contenir aucun code exécutable.Satellite assemblies can contain only resources; they cannot contain any executable code.

La commande al. exe suivante crée un assembly satellite pour l’application Example à partir du fichier de ressources allemand Strings. de. Resources.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

La commande al. exe suivante crée également un assembly satellite pour l’application Example à partir du fichier Strings. de. Resources.The following Al.exe command also creates a satellite assembly for the application Example from the file strings.de.resources. L’option /template fait en sorte que l’assembly satellite hérite de toutes les métadonnées d’assembly, à l’exception des informations de culture de l’assembly parent (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

Le tableau suivant décrit les options de al. exe utilisées dans ces commandes plus en détail :The following table describes the Al.exe options used in these commands in more detail:

OptionOption DescriptionDescription
-target:lib Spécifie que votre assembly satellite est compilé dans un fichier de bibliothèque (.dll).Specifies that your satellite assembly is compiled to a library (.dll) file. Comme un assembly satellite ne contient pas de code exécutable et n’est pas l’assembly principal d’une application, vous devez enregistrer les assemblys satellites en tant que 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 Spécifie le nom du fichier de ressources à incorporer lorsque al. exe compile l’assembly.Specifies the name of the resource file to embed when Al.exe compiles the assembly. Vous pouvez incorporer plusieurs fichiers .resources dans un assembly satellite mais, si vous suivez le modèle Hub and Spoke, vous devez compiler un assembly satellite pour chaque culture.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. Toutefois, vous pouvez créer des fichiers .resources séparés pour les chaînes et les objets.However, you can create separate .resources files for strings and objects.
-culture:de Spécifie la culture de la ressource à compiler.Specifies the culture of the resource to compile. Le Common Language Runtime utilise ces informations lors de la recherche des ressources pour une culture spécifiée.The common language runtime uses this information when it searches for the resources for a specified culture. Si vous omettez cette option, al. exe compilera toujours la ressource, mais le runtime ne pourra pas le trouver quand un utilisateur le demandera.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 Spécifie le nom du fichier de sortie.Specifies the name of the output file. Le nom doit respecter la norme d’appellation baseName.resources. extension, où baseName est le nom de l’assembly principal et extension est une extension valide (par exemple, .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). Notez que le runtime n’est pas en mesure de déterminer la culture d’un assembly satellite en fonction du nom de son fichier de sortie ; vous devez utiliser l’option /culture pour la spécifier.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 Spécifie un assembly à partir duquel l’assembly satellite va hériter de toutes les métadonnées de l’assembly, à l’exception du champ de culture.Specifies an assembly from which the satellite assembly will inherit all assembly metadata except the culture field. Cette option affecte les assemblys satellites uniquement si vous spécifiez un assembly qui a un nom fort.This option affects satellite assemblies only if you specify an assembly that has a strong name.

Pour obtenir la liste complète des options disponibles avec al. exe, consultez Assembly Linker (al. exe).For a complete list of options available with Al.exe, see Assembly Linker (Al.exe).

Assemblys satellites : un exempleSatellite Assemblies: An Example

Voici un exemple « Hello world » simple qui affiche une boîte de message contenant un message d’accueil localisé.The following is a simple "Hello world" example that displays a message box containing a localized greeting. L’exemple contient des ressources pour les cultures Anglais (États-Unis), Français (France) et Russe (Russie), et sa culture de secours est Anglais.The example includes resources for the English (United States), French (France), and Russian (Russia) cultures, and its fallback culture is English. Pour créer l’exemple, effectuez les étapes suivantes :To create the example, do the following:

  1. Créez un fichier de ressources nommé Greeting. resx ou Greeting. txt pour contenir la ressource pour la culture par défaut.Create a resource file named Greeting.resx or Greeting.txt to contain the resource for the default culture. Stockez une chaîne unique nommée HelloString dont la valeur est « Hello world! »Store a single string named HelloString whose value is "Hello world!" dans ce fichier.in this file.

  2. Pour indiquer que l’anglais (en) est la culture par défaut de l’application, ajoutez l’attribut System.Resources.NeutralResourcesLanguageAttribute suivant au fichier AssemblyInfo de l’application ou au fichier de code source principal qui sera compilé dans l’assembly principal de l’application.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. Ajoutez la prise en charge de cultures supplémentaires (en-US, fr-FR et ru-RU) à l’application comme suit :Add support for additional cultures (en-US, fr-FR, and ru-RU) to the application as follows:

    • Pour prendre en charge la culture en-US ou anglaise (États-Unis), créez un fichier de ressources nommé Greetings. en-US. resx ou Greeting. en-US. txt, et stockez-le dans une chaîne unique nommée HelloString dont la valeur est « Hi World ! ».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!".

    • Pour prendre en charge la culture fr-FR ou français (France), créez un fichier de ressources nommé Greeting.fr-fr. resx ou Greeting.fr Strings.fr. txt, et stockez-le dans une chaîne unique nommée HelloString dont la valeur est « salutation tout le Bonjour ! ».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!".

    • Pour prendre en charge la culture ru-RU ou russe (Russie), créez un fichier de ressources nommé Greeting.ru-RU. resx ou Greeting.ru Strings.ru. txt, et stockez-le dans une chaîne unique nommée HelloString dont la valeur est « Всем привет ! ».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. Utilisez Resgen. exe pour compiler chaque fichier de ressources texte ou XML dans un fichier . Resources binaire.Use Resgen.exe to compile each text or XML resource file to a binary .resources file. La sortie est un ensemble de fichiers qui ont le même nom de fichier racine que les fichiers . resx ou . txt , mais une extension . 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. Si vous créez l’exemple avec Visual Studio, le processus de compilation est géré automatiquement.If you create the example with Visual Studio, the compilation process is handled automatically. Si vous n’utilisez pas Visual Studio, exécutez les commandes suivantes pour compiler les fichiers . resx en fichiers . 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
    

    Si vos ressources se trouvent dans des fichiers texte et non pas dans des fichiers XML, remplacez l’extension . resx par . txt.If your resources are in text files instead of XML files, replace the .resx extension with .txt.

  5. Compilez le code source suivant avec les ressources de la culture par défaut dans l’assembly principal de l’application :Compile the following source code along with the resources for the default culture into the application's main assembly:

    Important

    Si vous utilisez la ligne de commande plutôt que Visual Studio pour créer l’exemple, vous devez modifier l’appel au constructeur de la classe ResourceManager comme suit :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
    

    Si l’application est nommée example et que vous compilez à partir de la ligne de commande, C# la commande pour le compilateur est la suivante :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
    

    La commande correspondante du compilateur Visual Basic est :The corresponding Visual Basic compiler command is:

    vbc Example.vb -res:Greeting.resources
    
  6. Créez un sous-répertoire dans le répertoire principal de l’application pour chaque culture localisée prise en charge par l’application.Create a subdirectory in the main application directory for each localized culture supported by the application. Vous devez créer un sous-répertoire en -US, fr-fret ru-RU .You should create an en-US, an fr-FR, and an ru-RU subdirectory. Visual Studio crée automatiquement ces sous-répertoires dans le cadre du processus de compilation.Visual Studio creates these subdirectories automatically as part of the compilation process.

  7. Incorporez les fichiers . Resources individuels spécifiques à la culture dans des assemblys satellites et enregistrez-les dans le répertoire approprié.Embed the individual culture-specific .resources files into satellite assemblies and save them to the appropriate directory. La commande permettant d’effectuer cette opération pour chaque fichier . Resources est la suivante :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 est le nom de la culture dont les ressources sont contenues dans l’assembly satellite.where culture is the name of the culture whose resources the satellite assembly contains. Visual Studio gère automatiquement ce processus.Visual Studio handles this process automatically.

Vous pouvez ensuite exécuter l’exemple.You can then run the example. Il choisit au hasard comme culture actuelle l’une des cultures prises en charge et affiche un message d’accueil localisé.It will randomly make one of the supported cultures the current culture and display a localized greeting.

Installation d’assemblys satellites dans le Global Assembly CacheInstalling Satellite Assemblies in the Global Assembly Cache

Au lieu d’installer des assemblys dans un sous-répertoire de l’application locale, vous pouvez les installer dans le Global Assembly Cache.Instead of installing assemblies in a local application subdirectory, you can install them in the global assembly cache. Ceci est particulièrement utile si vous avez des bibliothèques de classes et des assemblys de ressources de bibliothèques de classes qui sont utilisés par plusieurs applications.This is particularly useful if you have class libraries and class library resource assemblies that are used by multiple applications.

Pour être installés dans le Global Assembly Cache, les assemblys doivent avoir un nom fort.Installing assemblies in the global assembly cache requires that they have strong names. Les assemblys avec nom fort sont signés avec une paire de clés publique/privée valide.Strong-named assemblies are signed with a valid public/private key pair. Ils contiennent des informations de version que le runtime utilise pour déterminer l’assembly à utiliser pour répondre à une demande de liaison.They contain version information that the runtime uses to determine which assembly to use to satisfy a binding request. Pour plus d’informations sur les noms forts et le contrôle de version, consultez Contrôle de version des assemblys.For more information about strong names and versioning, see Assembly Versioning. Pour plus d’informations sur les noms forts, consultez Assemblys avec nom fort.For more information about strong names, see Strong-Named Assemblies.

Quand vous développez une application, il est peu probable que vous puissiez accéder à la paire de clés publique/privée finale.When you are developing an application, it is unlikely that you will have access to the final public/private key pair. Pour installer un assembly satellite dans le Global Assembly Cache et vous assurer qu’il fonctionne comme prévu, vous pouvez utiliser une technique appelée signature différée.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. Quand vous différez la signature d’un assembly, vous réservez au moment de la génération un espace dans le fichier pour la signature de nom fort.When you delay sign an assembly, at build time you reserve space in the file for the strong name signature. La signature réelle est différée jusqu’à une date ultérieure, quand la paire de clés publique/privée finale est disponible.The actual signing is delayed until later, when the final public/private key pair is available. Pour plus d’informations sur la signature différée, consultez Différer la signature d’un assembly.For more information about delayed signing, see Delay Signing an Assembly.

Obtention de la clé publiqueObtaining the Public Key

Pour différer la signature d’un assembly, vous devez avoir accès à la clé publique.To delay sign an assembly, you must have access to the public key. Vous pouvez soit obtenir la clé publique réelle à partir de l’organisation de votre société qui effectuera la signature finale, soit créer une clé publique en utilisant l’outil Strong Name Tool (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).

La commande sn. exe suivante crée une paire de clés publique/privée de test.The following Sn.exe command creates a test public/private key pair. L’option – k spécifie que sn. exe doit créer une nouvelle paire de clés et l’enregistrer dans un fichier nommé 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

Vous pouvez extraire la clé publique du fichier contenant la paire de clés de test.You can extract the public key from the file that contains the test key pair. La commande suivante extrait la clé publique de TestKeyPair. snk et l’enregistre dans PublicKey. snk:The following command extracts the public key from TestKeyPair.snk and saves it in PublicKey.snk:

sn –p TestKeyPair.snk PublicKey.snk

Temporisation de signature d'un assemblyDelay Signing an Assembly

Après avoir obtenu ou créé la clé publique, utilisez Assembly Linker (Al.exe) pour compiler l’assembly et spécifier une signature différée.After you obtain or create the public key, you use the Assembly Linker (Al.exe) to compile the assembly and specify delayed signing.

La commande al. exe suivante crée un assembly satellite avec nom fort pour l’application StringLibrary à partir du fichier Strings. ja. Resources :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

L’option -delay+ indique qu’Assembly Linker doit différer la signature de l’assembly.The -delay+ option specifies that the Assembly Linker should delay sign the assembly. L’option -keyfile spécifie le nom du fichier de clé qui contient la clé publique à utiliser pour différer la signature de l’assembly.The -keyfile option specifies the name of the key file that contains the public key to use to delay sign the assembly.

Nouvelle signature d’un assemblyRe-signing an Assembly

Avant de déployer votre application, vous devez signer à nouveau l’assembly satellite à signature différée avec la vraie valeur de paire de clés.Before you deploy your application, you must re-sign the delay signed satellite assembly with the real key pair. Pour ce faire, vous pouvez utiliser sn. exe.You can do this by using Sn.exe.

La commande sn. exe suivante signe StringLibrary. resources. dll avec la paire de clés stockée dans le fichier RealKeyPair. snk.The following Sn.exe command signs StringLibrary.resources.dll with the key pair stored in the file RealKeyPair.snk. L’option –R spécifie qu’un assembly déjà signé ou à signature différée doit être à nouveau signé.The –R option specifies that a previously signed or delay signed assembly is to be re-signed.

sn –R StringLibrary.resources.dll RealKeyPair.snk

Installation d’un assembly satellite dans le Global Assembly CacheInstalling a Satellite Assembly in the Global Assembly Cache

Quand le runtime recherche des ressources dans le processus de secours pour les ressources, il cherche d’abord dans le Global Assembly Cache.When the runtime searches for resources in the resource fallback process, it looks in the global assembly cache first. (Pour plus d’informations, consultez la section « processus de secours pour les ressources » de la rubrique empaquetage et déploiement de ressources .) Dès qu’un assembly satellite est signé avec un nom fort, il peut être installé dans le Global Assembly Cache à l’aide de l' outil global assembly cache (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).

La commande Gacutil. exe suivante installe StringLibrary. resources. dll* dans le global assembly cache :The following Gacutil.exe command installs StringLibrary.resources.dll* in the global assembly cache:

gacutil -i:StringLibrary.resources.dll

L’option /i spécifie que Gacutil. exe doit installer l’assembly spécifié dans la global assembly cache.The /i option specifies that Gacutil.exe should install the specified assembly into the global assembly cache. Une fois l’assembly satellite installé dans le cache, les ressources qu’il contient deviennent disponibles pour toutes les applications conçues pour utiliser l’assembly satellite.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.

Ressources dans le Global Assembly Cache : un exempleResources in the Global Assembly Cache: An Example

L’exemple suivant utilise une méthode dans une bibliothèque de classes .NET Framework pour extraire et retourner un message d’accueil localisé à partir d’un fichier de ressources.The following example uses a method in a .NET Framework class library to extract and return a localized greeting from a resource file. La bibliothèque et ses ressources sont inscrites dans le Global Assembly Cache.The library and its resources are registered in the global assembly cache. L’exemple contient des ressources pour les cultures Anglais (États-Unis), Français (France) et Russe (Russie).The example includes resources for the English (United States), French (France), Russian (Russia), and English cultures. L’anglais est la culture par défaut ; ses ressources sont stockées dans l’assembly principal.English is the default culture; its resources are stored in the main assembly. L’exemple diffère initialement la signature de la bibliothèque et ses assemblys satellites avec une clé publique, puis les signe à nouveau avec une paire de clés publique/privée.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. Pour créer l’exemple, effectuez les étapes suivantes :To create the example, do the following:

  1. Si vous n’utilisez pas Visual Studio, utilisez la commande Strong Name Tool (SN. exe) suivante pour créer une paire de clés publique/privée nommée 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
    

    Si vous utilisez Visual Studio, utilisez l’onglet Signature de la boîte de dialogue Propriétés du projet pour générer le fichier de clé.If you are using Visual Studio, use the Signing tab of the project Properties dialog box to generate the key file.

  2. Utilisez la commande Strong Name Tool (SN. exe) suivante pour créer un fichier de clé publique nommé 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. Créez un fichier de ressources nommé Strings. resx pour qu’il contienne la ressource pour la culture par défaut.Create a resource file named Strings.resx to contain the resource for the default culture. Stockez une chaîne unique nommée Greeting dont la valeur est « How do you do? »Store a single string named Greeting whose value is "How do you do?" dans ce fichier.in that file.

  4. Pour indiquer que l’anglais « en » est la culture par défaut de l’application, ajoutez l’attribut System.Resources.NeutralResourcesLanguageAttribute suivant au fichier AssemblyInfo de l’application ou au fichier de code source principal qui sera compilé dans l’assembly principal de l’application :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. Ajoutez la prise en charge de cultures supplémentaires (en-US, fr-FR et ru-RU) à l’application comme suit :Add support for additional cultures (the en-US, fr-FR, and ru-RU cultures) to the application as follows:

    • Pour prendre en charge la culture « en-US » ou anglais (États-Unis), créez un fichier de ressources nommé Strings. en-US. resx ou Strings. en-US. txt, et stockez-le dans une chaîne unique nommée Greeting dont la valeur est « Hello ! ».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!".

    • Pour prendre en charge la culture « fr-FR » ou français (France), créez un fichier de ressources nommé Strings.fr-fr. resx ou Strings.fr Strings.fr. txt et stockez-le dans une chaîne unique nommée Greeting dont la valeur est « bon jour ! ».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!".

    • Pour prendre en charge la culture « ru-RU » ou russe (Russie), créez un fichier de ressources nommé Strings.ru-RU. resx ou Strings.ru Strings.ru. txt et stockez-le dans une chaîne unique nommée Greeting dont la valeur est « привет ! ».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. Utilisez Resgen.exe pour compiler chaque fichier de ressources texte ou XML en un fichier .resources binaire.Use Resgen.exe to compile each text or XML resource file to a binary .resources file. La sortie est un ensemble de fichiers qui ont le même nom de fichier racine que les fichiers . resx ou . txt , mais une extension . 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. Si vous créez l’exemple avec Visual Studio, le processus de compilation est géré automatiquement.If you create the example with Visual Studio, the compilation process is handled automatically. Si vous n’utilisez pas Visual Studio, exécutez la commande suivante pour compiler les fichiers . resx en fichiers . Resources :If you aren't using Visual Studio, run the following command to compile the .resx files into .resources files:

    resgen filename
    

    filename est le chemin d’accès facultatif, le nom de fichier et l’extension du fichier . resx ou texte.Where filename is the optional path, file name, and extension of the .resx or text file.

  7. Compilez le code source suivant pour StringLibrary. vb ou StringLibrary.cs , ainsi que les ressources pour la culture par défaut dans un assembly de bibliothèque à signature différée nommé StringLibrary. dll: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:

    Important

    Si vous utilisez la ligne de commande plutôt que Visual Studio pour créer l’exemple, vous devez remplacer l’appel au constructeur de la classe ResourceManager par 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
    

    La commande pour le compilateur C# est :The command for the C# compiler is:

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

    La commande correspondante du compilateur Visual Basic est :The corresponding Visual Basic compiler command is:

    vbc -t:library -resource:Strings.resources -delaysign+ -keyfile:publickey.snk StringLibrary.vb
    
  8. Créez un sous-répertoire dans le répertoire principal de l’application pour chaque culture localisée prise en charge par l’application.Create a subdirectory in the main application directory for each localized culture supported by the application. Vous devez créer un sous-répertoire en -US, fr-fret ru-RU .You should create an en-US, an fr-FR, and an ru-RU subdirectory. Visual Studio crée automatiquement ces sous-répertoires dans le cadre du processus de compilation.Visual Studio creates these subdirectories automatically as part of the compilation process. Comme tous les assemblys satellites ont le même nom de fichier, les sous-répertoires permettent de stocker des assemblys satellites individuels spécifiques à la culture jusqu’à ce qu’ils soient signés avec une paire de clés publique/privée.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. Incorporez les fichiers . Resources individuels spécifiques à la culture dans des assemblys satellites signés différés et enregistrez-les dans le répertoire approprié.Embed the individual culture-specific .resources files into delay signed satellite assemblies and save them to the appropriate directory. La commande permettant d’effectuer cette opération pour chaque fichier . Resources est la suivante :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 est le nom d’une culture.where culture is the name of a culture. Dans cet exemple, les noms de culture sont en-US, fr-FR et ru-RU.In this example, the culture names are en-US, fr-FR, and ru-RU.

  10. Resignez StringLibrary. dll à l’aide de l' outil Strong Name Tool (SN. exe) comme suit :Re-sign StringLibrary.dll by using the Strong Name Tool (Sn.exe) as follows:

    sn –R StringLibrary.dll RealKeyPair.snk
    
  11. Signez à nouveau les assemblys satellites individuels.Re-sign the individual satellite assemblies. Pour ce faire, utilisez Strong Name Tool (Sn.exe) comme suit pour chaque assembly satellite :To do this, use the Strong Name Tool (Sn.exe) as follows for each satellite assembly:

    sn –R StringLibrary.resources.dll RealKeyPair.snk
    
  12. Inscrivez StringLibrary. dll et chacun de ses assemblys satellites dans le global assembly cache à l’aide de la commande suivante :Register StringLibrary.dll and each of its satellite assemblies in the global assembly cache by using the following command:

    gacutil -i filename
    

    filename représente le nom du fichier à inscrire.where filename is the name of the file to register.

  13. Si vous utilisez Visual Studio, créez un projet d' application console nommé Example, ajoutez une référence à StringLibrary. dll et le code source suivant, puis compilez.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
    

    Pour compiler à partir de la ligne de commande, utilisez la commande suivante pour le compilateur C# :To compile from the command line, use the following command for the C# compiler:

    csc Example.cs -r:StringLibrary.dll
    

    La ligne de commande pour le compilateur Visual Basic est :The command line for the Visual Basic compiler is:

    vbc Example.vb -r:StringLibrary.dll
    
  14. Exécutez example. exe.Run Example.exe.

Voir aussiSee also