Crear ensamblados satélite para aplicaciones de escritorioCreating Satellite Assemblies for Desktop Apps

Los archivos de recursos desempeñan un papel fundamental en las aplicaciones localizadas.Resource files play a central role in localized applications. Permiten que una aplicación muestre cadenas, imágenes y otros datos en el idioma y la referencia cultural del usuario, y que proporcione datos alternativos si los recursos para el idioma o la referencia cultural del usuario no están 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. .NET Framework usa un modelo de concentrador y radio para buscar y recuperar recursos localizados.The .NET Framework uses a hub-and-spoke model to locate and retrieve localized resources. El concentrador es el ensamblado principal que contiene el código ejecutable no localizable y los recursos de una referencia cultural única, denominada referencia cultural neutra o predeterminada.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 referencia cultural predeterminada es la referencia cultural de reserva de la aplicación y se usa si no hay recursos localizados disponibles.The default culture is the fallback culture for the application; it is used when no localized resources are available. El atributo NeutralResourcesLanguageAttribute se usa para designar la referencia cultural predeterminada de la aplicación.You use the NeutralResourcesLanguageAttribute attribute to designate the culture of the application's default culture. Cada radio se conecta a un ensamblado satélite que contiene los recursos de una única referencia cultural localizada, pero no contiene código.Each spoke connects to a satellite assembly that contains the resources for a single localized culture but does not contain any code. Debido a que los ensamblados satélite no forman parte del ensamblado principal, los recursos correspondientes a una referencia cultural específica se pueden actualizar o reemplazar fácilmente sin reemplazar el ensamblado principal de la aplicación.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.

Nota

Los recursos de la referencia cultural predeterminada de una aplicación también se pueden almacenar en un ensamblado satélite.The resources of an application's default culture can also be stored in a satellite assembly. Para ello, asigne al atributo NeutralResourcesLanguageAttribute un valor de UltimateResourceFallbackLocation.Satellite.To do this, you assign the NeutralResourcesLanguageAttribute attribute a value of UltimateResourceFallbackLocation.Satellite.

Nombre y ubicación del ensamblado satéliteSatellite Assembly Name and Location

El modelo de concentrador y radio requiere colocar recursos en ubicaciones específicas para que sea fácil ubicarlos y usarlos.The hub-and-spoke model requires that you place resources in specific locations so that they can be easily located and used. Si no compila los recursos y les asigna el nombre de la manera prevista, o si no los coloca en las ubicaciones correctas, Common Language Runtime no podrá encontrarlos y usará en su lugar los recursos de la referencia cultural predeterminada.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. Para tener acceso automáticamente a los recursos localizados se usa el Administrador de recursos de .NET Framework, representado por un objeto ResourceManager.The .NET Framework Resource Manager, represented by a ResourceManager object, is used to automatically access localized resources. El Administrador de recursos requiere lo siguiente:The Resource Manager requires the following:

  • Todos los recursos de una referencia cultural determinada deben estar incluidos en un solo ensamblado satélite.A single satellite assembly must include all the resources for a particular culture. En otras palabras, debe compilar varios archivos .txt o .resx en un solo archivo .resources binario.In other words, you should compile multiple .txt or .resx files into a single binary .resources file.

  • Debe haber un subdirectorio independiente en el directorio de la aplicación para cada referencia cultural localizada que almacena los recursos de esa referencia cultural.There must be a separate subdirectory in the application directory for each localized culture that stores that culture's resources. El nombre del subdirectorio debe ser el mismo que el nombre de la referencia cultural.The subdirectory name must be the same as the culture name. Como alternativa, puede almacenar los ensamblados satélite en la caché global de ensamblados.Alternately, you can store your satellite assemblies in the global assembly cache. En este caso, el componente de información de referencia cultural del nombre seguro del ensamblado debe indicar su referencia cultural.In this case, the culture information component of the assembly's strong name must indicate its culture. (Vea la sección Instalar ensamblados satélite en la caché global de ensamblados más adelante en este tema).(See the Installing Satellite Assemblies in the Global Assembly Cache section later in this topic.)

    Nota

    Si la aplicación incluye recursos para referencias culturales secundarias, coloque cada una de ellas en un subdirectorio independiente bajo el directorio de la aplicación.If your application includes resources for subcultures, place each subculture in a separate subdirectory under the application directory. No coloque las referencias culturales secundarias en subdirectorios bajo el directorio de la referencia cultural principal.Do not place subcultures in subdirectories under their main culture's directory.

  • El ensamblado satélite debe tener el mismo nombre que la aplicación y debe usar la extensión de nombre de archivo ".resources.dll".The satellite assembly must have the same name as the application, and must use the file name extension ".resources.dll". Por ejemplo, si una aplicación se denomina Example.exe, el nombre de cada ensamblado satélite debe ser Example.resources.dll.For example, if an application is named Example.exe, the name of each satellite assembly should be Example.resources.dll. Tenga en cuenta que el nombre del ensamblado satélite no indica la referencia cultural de sus archivos de recursos.Note that the satellite assembly name does not indicate the culture of its resource files. Aun así, el ensamblado satélite aparece en un directorio que especifica la referencia cultural.However, the satellite assembly appears in a directory that does specify the culture.

  • La información sobre la referencia cultural del ensamblado satélite debe incluirse en los metadatos del ensamblado.Information about the culture of the satellite assembly must be included in the assembly's metadata. Para almacenar el nombre de la referencia cultural en los metadatos del ensamblado satélite, especifique la opción /culture cuando use Assembly Linker para insertar recursos en el ensamblado satélite.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.

En la ilustración siguiente se muestran los requisitos de ejemplo de la estructura y la ubicación de los directorios para las aplicaciones que no se instalan en la caché global de ensamblados.The following illustration shows a sample directory structure and location requirements for applications that you are not installing in the global assembly cache. Los elementos con las extensiones .txt y .resources no se incluirán en la aplicación final.The items with .txt and .resources extensions will not ship with the final application. Estos son los archivos de recursos intermedios que se usan para crear los ensamblados de recursos satélite finales.These are the intermediate resource files used to create the final satellite resource assemblies. En este ejemplo, los archivos .resx se pueden sustituir por archivos .txt.In this example, you could substitute .resx files for the .txt files. Para obtener más información, vea Packaging and Deploying Resources (Empaquetar e implementar recursos).For more information, see Packaging and Deploying Resources.

Ensamblados satéliteSatellite assemblies
Directorio del ensamblado satéliteSatellite assembly directory

compilar ensamblados satéliteCompiling Satellite Assemblies

Para compilar archivos de texto o archivos XML (.resx) que contienen recursos en archivos .resources binarios, use el generador de archivos de recursos (Resgen.exe).You use Resource File Generator (Resgen.exe) to compile text files or XML (.resx) files that contain resources to binary .resources files. Después, use Assembly Linker (Al.exe) para compilar los archivos .resources en ensamblados satélite.You then use Assembly Linker (Al.exe) to compile .resources files into satellite assemblies. Al.exe crea un ensamblado a partir de los archivos .resources que especifique.Al.exe creates an assembly from the .resources files that you specify. Los ensamblados satélite solo pueden contener recursos; no pueden contener código ejecutable.Satellite assemblies can contain only resources; they cannot contain any executable code.

El siguiente comando de Al.exe crea un ensamblado satélite para la aplicación Example a partir del archivo de recursos de alemán 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  

El siguiente comando de Al.exe también crea un ensamblado satélite para la aplicación Example a partir del archivo strings.de.resources.The following Al.exe command also creates a satellite assembly for the application Example from the file strings.de.resources. La opción /template hace que el ensamblado satélite herede todos los metadatos del ensamblado salvo la información de referencia cultural del ensamblado principal (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  

En la tabla siguiente se describen detalladamente las opciones de Al.exe usadas en estos comandos.The following table describes the Al.exe options used in these commands in more detail.

OpciónOption DescriptionDescription
-target: lib-target: lib Especifica que el ensamblado satélite se compila en un archivo de biblioteca (.dll).Specifies that your satellite assembly is compiled to a library (.dll) file. Dado que un ensamblado satélite no contiene código ejecutable y no es el ensamblado principal de la aplicación, debe guardar los ensamblados satélite como archivos 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 Especifica el nombre del archivo de recursos que se va a insertar cuando Al.exe compile el ensamblado.Specifies the name of the resource file to embed when Al.exe compiles the assembly. Puede insertar varios archivos .resources en un ensamblado satélite, pero si sigue el modelo de concentrador y radio, debe compilar un ensamblado satélite para cada referencia cultural.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. Aun así, puede crear archivos .resources independientes para cadenas y objetos.However, you can create separate .resources files for strings and objects.
-culture: de-culture: de Especifica la referencia cultural del recurso que se va a compilar.Specifies the culture of the resource to compile. Common Language Runtime usa esta información cuando busca los recursos para la referencia cultural especificada.The common language runtime uses this information when it searches for the resources for a specified culture. Si se omite esta opción, Al.exe compilará igualmente el recurso, pero el tiempo de ejecución no podrá encontrarlo cuando un usuario lo solicite.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 Especifica el nombre del archivo de salida.Specifies the name of the output file. El nombre debe seguir la convención de nomenclatura baseName.resources.extension, donde baseName es el nombre del ensamblado principal y extension es una extensión de nombre de archivo válida (por ejemplo, .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). Tenga en cuenta que el tiempo de ejecución no puede determinar la referencia cultural de un ensamblado satélite a partir del nombre de su archivo de salida; debe usar la opción /culture para especificarla.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 Especifica el ensamblado del que el ensamblado satélite heredará todos los metadatos de ensamblado, salvo el campo correspondiente a la referencia cultural.Specifies an assembly from which the satellite assembly will inherit all assembly metadata except the culture field. Esta opción solo afecta a los ensamblados satélite si se especifica un ensamblado con nombre seguro.This option affects satellite assemblies only if you specify an assembly that has a strong name.

Para obtener una lista completa de las opciones disponibles con Al.exe, vea Assembly Linker (Al.exe).For a complete list of options available with Al.exe, see Assembly Linker (Al.exe).

Ejemplo de ensamblados satéliteSatellite Assemblies: An Example

A continuación se incluye un ejemplo sencillo de "Hola a todos" que muestra un cuadro de mensaje con un saludo localizado.The following is a simple "Hello world" example that displays a message box containing a localized greeting. El ejemplo incluye recursos para las referencias culturales de inglés (Estados Unidos), francés (Francia) y ruso (Rusia), y su referencia cultural de reserva es inglés.The example includes resources for the English (United States), French (France), and Russian (Russia) cultures, and its fallback culture is English. Para crear este ejemplo, haga lo siguiente:To create the example, do the following:

  1. Cree un archivo de recursos denominado Greeting.resx o Greeting.txt para que contenga el recurso para la referencia cultural predeterminada.Create a resource file named Greeting.resx or Greeting.txt to contain the resource for the default culture. Almacene una sola cadena denominada HelloString cuyo valor sea "Hola a todos"Store a single string named HelloString whose value is "Hello world!" en este archivo.in this file.

  2. Para indicar que el inglés (en) es la referencia cultural predeterminada de la aplicación, agregue el siguiente atributo System.Resources.NeutralResourcesLanguageAttribute al archivo AssemblyInfo de la aplicación o al archivo de código fuente principal que se compilará en el ensamblado principal de la aplicación.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. Agregue compatibilidad para referencias culturales adicionales (en-US, fr-FR y ru-RU) a la aplicación de la manera siguiente:Add support for additional cultures (en-US, fr-FR, and ru-RU) to the application as follows:

    • Para admitir la referencia cultural en-US o inglés (Estados Unidos), cree un archivo de recursos denominado Greeting.en-US.resx o Greeting.en-US.txt y almacene en él una sola cadena denominada HelloString cuyo valor sea "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!"

    • Para admitir la referencia cultural fr-FR o francés (Francia), cree un archivo de recursos denominado Greeting.fr-FR.resx o Greeting.fr-FR.txt y almacene en él una sola cadena denominada HelloString cuyo valor sea "Salut tout le monde!".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!"

    • Para admitir la referencia cultural ru-RU o ruso (Rusia), cree un archivo de recursos denominado Greeting.ru-RU.resx o Greeting.ru-RU.txt, y almacene en él una sola cadena denominada HelloString cuyo valor sea "Всем привет!".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. Use Resgen.exe para compilar cada texto o archivo de recursos XML en un archivo .resources binario.Use Resgen.exe to compile each text or XML resource file to a binary .resources file. La salida es un conjunto de archivos que tienen el mismo nombre de archivo raíz, como los archivos .resx o .txt, pero con una extensión .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 crea el ejemplo con Visual Studio, el proceso de compilación se realiza automáticamente.If you create the example with Visual Studio, the compilation process is handled automatically. Si no está usando Visual Studio, ejecute los comandos siguientes para compilar los archivos .resx en archivos .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 los recursos se encuentran en archivos de texto en lugar de archivos XML, cambie la extensión .resx a .txt.If your resources are in text files instead of XML files, replace the .resx extension with .txt.

  5. Compile el código fuente siguiente junto con los recursos para la referencia cultural predeterminada en el ensamblado principal de la aplicación:Compile the following source code along with the resources for the default culture into the application's main assembly:

    Importante

    Si usa la línea de comandos en lugar de Visual Studio para crear el ejemplo, debe modificar la llamada al constructor de clase ResourceManager de la siguiente manera: 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 la aplicación se denomina Example y está compilando desde la línea de comandos, el comando para el compilador de C# es el siguiente: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  
    

    El comando de compilador de Visual Basic correspondiente es el siguiente:The corresponding Visual Basic compiler command is:

    vbc Example.vb -res:Greeting.resources  
    
  6. Cree un subdirectorio en el directorio principal de la aplicación para cada referencia cultural localizada admitida por la aplicación.Create a subdirectory in the main application directory for each localized culture supported by the application. Debe crear un subdirectorio en-US, fr-FR, y ru-RU.You should create an en-US, an fr-FR, and an ru-RU subdirectory. Visual Studio crea estos subdirectorios automáticamente como parte del proceso de compilación.Visual Studio creates these subdirectories automatically as part of the compilation process.

  7. Inserte los archivos .resources individuales específicos de la referencia cultural en ensamblados satélite y guárdelos en el directorio adecuado.Embed the individual culture-specific .resources files into satellite assemblies and save them to the appropriate directory. El comando para hacer esto para cada archivo .resources es el siguiente:The command to do this for each .resources file is:

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

    donde culture es el nombre de la referencia cultural cuyos recursos contiene el ensamblado satélite.where culture is the name of the culture whose resources the satellite assembly contains. Visual Studio controla este proceso automáticamente.Visual Studio handles this process automatically.

Después, ya puede ejecutar el ejemplo.You can then run the example. Seleccionará aleatoriamente como referencia cultural actual una de las referencias culturales admitidas y mostrará un saludo localizado.It will randomly make one of the supported cultures the current culture and display a localized greeting.

Instalar ensamblados satélite en la caché global de ensambladosInstalling Satellite Assemblies in the Global Assembly Cache

En lugar de instalar los ensamblados en el subdirectorio de una aplicación local, puede instalarlos en la caché global de ensamblados.Instead of installing assemblies in a local application subdirectory, you can install them in the global assembly cache. Esto es especialmente útil si tiene bibliotecas de clases y ensamblados de recursos de bibliotecas de clases que usan varias aplicaciones.This is particularly useful if you have class libraries and class library resource assemblies that are used by multiple applications.

Para instalar ensamblados en la caché global de ensamblados, es necesario que tengan nombres seguros.Installing assemblies in the global assembly cache requires that they have strong names. Los ensamblados con nombre seguro se firman con un par de claves pública y privada válido.Strong-named assemblies are signed with a valid public/private key pair. Contienen información de versión que el tiempo de ejecución usa para determinar qué ensamblado debe usar para atender a una solicitud de enlace.They contain version information that the runtime uses to determine which assembly to use to satisfy a binding request. Para obtener más información sobre los nombres seguros y las versiones, vea Assembly Versioning (Versiones de los ensamblados).For more information about strong names and versioning, see Assembly Versioning. Para obtener más información sobre los nombres seguros, vea Strong-Named Assemblies (Ensamblados con nombre seguro).For more information about strong names, see Strong-Named Assemblies.

Cuando esté desarrollando una aplicación, es poco probable que tenga acceso al par de claves pública y privada final.When you are developing an application, it is unlikely that you will have access to the final public/private key pair. Para instalar un ensamblado satélite en la caché global de ensamblados y asegurarse de que funciona según lo previsto, puede usar una técnica denominada firma retardada.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. Cuando se retrasa la firma de un ensamblado, en tiempo de compilación se reserva espacio en el archivo para la firma de nombre seguro.When you delay sign an assembly, at build time you reserve space in the file for the strong name signature. La firma real se retrasa hasta más adelante, cuando esté disponible el par de claves pública y privada final.The actual signing is delayed until later, when the final public/private key pair is available. Para obtener más información sobre la firma retardada, vea Delay Signing an Assembly (Retrasar la firma de un ensamblado).For more information about delayed signing, see Delay Signing an Assembly.

Obtener la clave públicaObtaining the Public Key

Para retrasar la firma de un ensamblado, debe tener acceso a la clave pública.To delay sign an assembly, you must have access to the public key. Puede obtener la clave pública real de la organización que se encargará de la firma, o bien puede crear una clave pública mediante la herramienta de nombre seguro (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).

El siguiente comando de Sn.exe crea un par de claves pública y privada de prueba.The following Sn.exe command creates a test public/private key pair. La opción –k especifica que Sn.exe debe crear un par de claves y guardarlo en un archivo denominado 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   

Puede extraer la clave pública del archivo que contiene el par de claves de prueba.You can extract the public key from the file that contains the test key pair. El comando siguiente extrae la clave pública de TestKeyPair.snk y la guarda en PublicKey.snk:The following command extracts the public key from TestKeyPair.snk and saves it in PublicKey.snk:

sn –p TestKeyPair.snk PublicKey.snk  

Retrasar la firma de un ensambladoDelay Signing an Assembly

Después de obtener o crear la clave pública, use Assembly Linker (Al.exe) para compilar el ensamblado y especificar la firma retardada.After you obtain or create the public key, you use the Assembly Linker (Al.exe) to compile the assembly and specify delayed signing.

El siguiente comando de Al.exe crea un ensamblado satélite con nombre seguro para la aplicación StringLibrary a partir del archivo 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  

La opción -delay+ especifica que Assembly Linker debe retrasar la firma del ensamblado.The -delay+ option specifies that the Assembly Linker should delay sign the assembly. La opción -keyfile especifica el nombre del archivo de claves que contiene la clave pública que se va a usar para retrasar la firma del ensamblado.The -keyfile option specifies the name of the key file that contains the public key to use to delay sign the assembly.

Volver a firmar un ensambladoRe-signing an Assembly

Antes de implementar la aplicación, debe volver a firmar el ensamblado satélite con firma retrasada mediante el par de claves real.Before you deploy your application, you must re-sign the delay signed satellite assembly with the real key pair. Para ello, use Sn.exe.You can do this by using Sn.exe.

El siguiente comando de Sn.exe firma StringLibrary.resources.dll con el par de claves almacenado en el archivo RealKeyPair.snk.The following Sn.exe command signs StringLibrary.resources.dll with the key pair stored in the file RealKeyPair.snk. La opción –R especifica que se debe volver a firmar un ensamblado ya firmado o con firma retrasada.The –R option specifies that a previously signed or delay signed assembly is to be re-signed.

sn –R StringLibrary.resources.dll RealKeyPair.snk   

Instalar un ensamblado satélite en la caché global de ensambladosInstalling a Satellite Assembly in the Global Assembly Cache

Cuando el tiempo de ejecución busca recursos en el proceso de reserva de recursos, busca primero en la caché global de ensamblados.When the runtime searches for resources in the resource fallback process, it looks in the global assembly cache first. (Para obtener más información, vea la sección sobre el proceso de reserva de recursos del tema Packaging and Deploying Resources (Empaquetar e implementar recursos)). En cuanto se firma un ensamblado satélite con un nombre seguro, puede instalarse en la caché global de ensamblados mediante la herramienta Caché global de ensamblados (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).

El siguiente comando de Gacutil.exe instala StringLibrary.resources.dll en la caché global de ensamblados:The following Gacutil.exe command installs StringLibrary.resources.dll in the global assembly cache:

gacutil -i:StringLibrary.resources.dll  

La opción /i especifica que Gacutil.exe debe instalar el ensamblado especificado en la caché global de ensamblados.The /i option specifies that Gacutil.exe should install the specified assembly into the global assembly cache. Una vez que se ha instalado el ensamblado satélite en la caché, los recursos que contiene están disponibles para todas las aplicaciones que están diseñadas para usar el ensamblado satélite.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.

Ejemplo de recursos en la caché global de ensambladosResources in the Global Assembly Cache: An Example

En el ejemplo siguiente se usa un método en una biblioteca de clases de .NET Framework para extraer y devolver un saludo localizado de un archivo de recursos.The following example uses a method in a .NET Framework class library to extract and return a localized greeting from a resource file. La biblioteca y sus recursos están registrados en la caché global de ensamblados.The library and its resources are registered in the global assembly cache. El ejemplo incluye recursos para las referencias culturales de inglés (Estados Unidos), francés (Francia), ruso (Rusia) e inglés.The example includes resources for the English (United States), French (France), Russian (Russia), and English cultures. El inglés es la referencia cultural predeterminada y sus recursos están almacenados en el ensamblado principal.English is the default culture; its resources are stored in the main assembly. En el ejemplo inicialmente se retrasa la firma de la biblioteca y sus ensamblados satélite con una clave pública y, después, se vuelven a firmar con un par de claves pública y privada.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. Para crear este ejemplo, haga lo siguiente:To create the example, do the following:

  1. Si no está usando Visual Studio, use el siguiente comando de la herramienta de nombre seguro (Sn.exe) para crear un par de claves pública y privada denominado 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 está usando Visual Studio, use la pestaña Firma del cuadro de diálogo Propiedades del proyecto para generar el archivo de clave.If you are using Visual Studio, use the Signing tab of the project Properties dialog box to generate the key file.

  2. Use el siguiente comando de la herramienta de nombre seguro (Sn.exe) para crear un archivo de clave pública denominado 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. Cree un archivo de recursos denominado Strings.resx para que contenga el recurso para la referencia cultural predeterminada.Create a resource file named Strings.resx to contain the resource for the default culture. Almacene una sola cadena denominada Greeting cuyo valor sea "¿Qué tal?"Store a single string named Greeting whose value is "How do you do?" en ese archivo.in that file.

  4. Para indicar que "en" es la referencia cultural predeterminada de la aplicación, agregue el siguiente atributo System.Resources.NeutralResourcesLanguageAttribute al archivo AssemblyInfo de la aplicación o al archivo de código fuente principal que se compilará en el ensamblado principal de la aplicación: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. Agregue compatibilidad para referencias culturales adicionales (en-US, fr-FR y ru-RU) a la aplicación de la manera siguiente:Add support for additional cultures (the en-US, fr-FR, and ru-RU cultures) to the application as follows:

    • Para admitir la referencia cultural "en-US" o inglés (Estados Unidos), cree un archivo de recursos denominado Strings.en-US.resx o Strings.en-US.txt y almacene en él una sola cadena denominada Greeting cuyo valor sea "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!".

    • Para admitir la referencia cultural "fr-FR" o francés (Francia), cree un archivo de recursos denominado Strings.fr-FR.resx o Strings.fr-FR.txt y almacene en él una sola cadena denominada Greeting cuyo valor sea "Bonjour!".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!"

    • Para admitir la referencia cultural "ru-RU" o ruso (Rusia), cree un archivo de recursos denominado Strings.ru-RU.resx o Strings.ru-RU.txt, y almacene en él una sola cadena denominada Greeting cuyo valor sea "Привет!".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. Use Resgen.exe para compilar cada texto o archivo de recursos XML en un archivo .resources binario.Use Resgen.exe to compile each text or XML resource file to a binary .resources file. La salida es un conjunto de archivos que tienen el mismo nombre de archivo raíz, como los archivos .resx o .txt, pero con una extensión .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 crea el ejemplo con Visual Studio, el proceso de compilación se realiza automáticamente.If you create the example with Visual Studio, the compilation process is handled automatically. Si no está usando Visual Studio, ejecute el comando siguiente para compilar los archivos .resx en archivos .resources:If you aren't using Visual Studio, run the following command to compile the .resx files into .resources files:

    resgen filename  
    

    donde filename es la ruta de acceso opcional, el nombre de archivo y la extensión del archivo .resx o de texto.where filename is the optional path, file name, and extension of the .resx or text file.

  7. Compile el siguiente código fuente para StringLibrary.vb o StringLibrary.cs junto con los recursos para la referencia cultural predeterminada en un ensamblado de biblioteca con firma retrasada denominado 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:

    Importante

    Si usa la línea de comandos en lugar de Visual Studio para crear el ejemplo, debe modificar la llamada al constructor de clase ResourceManager de la siguiente manera: 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
    

    El comando para el compilador de C# es el siguiente:The command for the C# compiler is:

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

    El comando de compilador de Visual Basic correspondiente es el siguiente:The corresponding Visual Basic compiler command is:

    vbc -t:library -resource:Strings.resources -delaysign+ -keyfile:publickey.snk StringLibrary.vb  
    
  8. Cree un subdirectorio en el directorio principal de la aplicación para cada referencia cultural localizada admitida por la aplicación.Create a subdirectory in the main application directory for each localized culture supported by the application. Debe crear un subdirectorio en-US, fr-FR, y ru-RU.You should create an en-US, an fr-FR, and an ru-RU subdirectory. Visual Studio crea estos subdirectorios automáticamente como parte del proceso de compilación.Visual Studio creates these subdirectories automatically as part of the compilation process. Dado que todos los ensamblados satélite tienen el mismo nombre de archivo, se usan los subdirectorios para almacenar los ensamblados satélite individuales específicos de la referencia cultural hasta que se firmen con un par de claves pública y privada.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. Inserte los archivos .resources individuales específicos de la referencia cultural en ensamblados satélite con firma retrasada y guárdelos en el directorio adecuado.Embed the individual culture-specific .resources files into delay signed satellite assemblies and save them to the appropriate directory. El comando para hacer esto para cada archivo .resources es el siguiente: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  
    

    donde culture es el nombre de una referencia cultural.where culture is the name of a culture. En este ejemplo, los nombres de referencia cultural son en-US, fr-FR y ru-RU.In this example, the culture names are en-US, fr-FR, and ru-RU.

  10. Vuelva a firmar StringLibrary.dll mediante la herramienta de nombre seguro (Sn.exe) de la manera siguiente:Re-sign StringLibrary.dll by using the Strong Name Tool (Sn.exe) as follows:

    sn –R StringLibrary.dll RealKeyPair.snk  
    
  11. Vuelva a firmar los ensamblados satélite individuales.Re-sign the individual satellite assemblies. Para ello, use la herramienta de nombre seguro (Sn.exe) como se indica a continuación para cada ensamblado satélite:To do this, use the Strong Name Tool (Sn.exe) as follows for each satellite assembly:

    sn –R StringLibrary.resources.dll RealKeyPair.snk  
    
  12. Registre StringLibrary.dll y cada uno de sus ensamblados satélite en la caché global de ensamblados mediante el comando siguiente:Register StringLibrary.dll and each of its satellite assemblies in the global assembly cache by using the following command:

    gacutil -i filename  
    

    donde filename es el nombre del archivo que se va a registrar.where filename is the name of the file to register.

  13. Si está usando Visual Studio, cree un proyecto de aplicación de consola denominado Example, agréguele una referencia a StringLibrary.dll y el siguiente código fuente, y compílelo.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
    

    Para compilar desde la línea de comandos, use el comando siguiente para el compilador de C#:To compile from the command line, use the following command for the C# compiler:

    csc Example.cs -r:StringLibrary.dll   
    

    La línea de comandos para el compilador de Visual Basic es la siguiente:The command line for the Visual Basic compiler is:

    vbc Example.vb -r:StringLibrary.dll   
    
  14. Ejecute Example.exe.Run Example.exe.

Vea tambiénSee Also

Empaquetar e implementar recursosPackaging and Deploying Resources
Retrasar la firma de un ensambladoDelay Signing an Assembly
Al.exe (Assembly Linker)Al.exe (Assembly Linker)
Sn.exe (Herramienta de nombre seguro)Sn.exe (Strong Name Tool)
Gacutil.exe (Herramienta Caché global de ensamblados)Gacutil.exe (Global Assembly Cache Tool)
Recursos de aplicaciones de escritorioResources in Desktop Apps