Exportar (0) Imprimir
Expandir todo
Este artículo se tradujo de forma manual. Mueva el puntero sobre las frases del artículo para ver el texto original. Más información.
Traducción
Original

Recursos de aplicación para bibliotecas destinadas a varias plataformas

.NET Framework 4.5

Puede usar la Biblioteca de clases portable de .NET Framework para garantizar que se pueda obtener acceso a los recursos de las bibliotecas de clases desde varias plataformas.

Este tipo de proyecto está disponible en Visual Studio 2012 y tiene como destino el subconjunto portable de la biblioteca de clases de .NET Framework. Mediante la Biblioteca de clases portable se garantiza que se pueda obtener acceso a la biblioteca desde las aplicaciones de escritorio, aplicaciones Silverlight, aplicaciones Windows Phone y aplicaciones de la Tienda Windows.

El proyecto de Biblioteca de clases portable es solo un subconjunto muy limitado de los tipos del espacio de nombres System.Resources disponible para la aplicación, pero podrá usar la clase ResourceManager para recuperar recursos. Sin embargo, si está creando una aplicación mediante el uso de Visual Studio, debe usar el contenedor fuertemente tipado creado con Visual Studio en lugar de utilizar la clase ResourceManager directamente.

Para crear un contenedor fuertemente tipado en Visual Studio, establezca el Modificador de acceso del archivo de recursos principal como Public en el diseñador de recursos de Visual Studio. Esto crea un archivo [nombreArchivoRecursos].designer.cs o [nombreArchivoRecursos].designer.vb que incluye el contenedor ResourceManager fuertemente tipado. Para obtener más información acerca del uso de un contenedor de recursos fuertemente tipado, vea la sección sobre la generación de una clase de recursos fuertemente tipada en el tema Resgen.exe (Generador de archivos de recursos).

En un proyecto de Biblioteca de clases portable, todo el acceso a los recursos lo controla la clase ResourceManager. Dado que no se puede tener acceso a los tipos del espacio de nombres System.Resources, como ResourceReader y ResourceSet, desde un proyecto de Biblioteca de clases portable, estos no pueden utilizarse para obtener acceso a los recursos.

El proyecto de Biblioteca de clases portable incluye los cuatro miembros de ResourceManager que se enumeran en la tabla siguiente. Estos constructores y métodos permiten crear una instancia de un objeto ResourceManager y recuperar recursos de cadena.

Miembro ResourceManager

Descripción

#ctor(String, Assembly)

Crea una instancia de ResourceManager para obtener acceso al archivo de recursos con nombre que se encuentra en el ensamblado especificado.

#ctor(Type)

Crea una instancia de ResourceManager que corresponde al tipo especificado.

GetString(String)

Recupera un recurso con nombre para la referencia cultural actual.

GetString(String, CultureInfo)

Recupera un recurso con nombre que pertenece a la referencia cultural especificada.

La exclusión de otros miembros de ResourceManager de la Biblioteca de clases portable significa que no pueden recuperarse objetos serializados, datos que no son de cadena e imágenes de un archivo de recursos. Para usar los recursos de una Biblioteca de clases portable, debe almacenar todos los datos de objeto en formato de cadena. Por ejemplo, para almacenar valores numéricos en un archivo de recursos, estos pueden convertirse en cadenas. A continuación, podrán recuperarse y convertirse de nuevo en números con los métodos Parse o TryParse del tipo de datos numérico. Puede convertir imágenes u otros datos binarios en una representación de cadena mediante una llamada al método Convert.ToBase64String y restaurarlos en una matriz de bytes mediante una llamada al método Convert.FromBase64String.

Los proyectos de Biblioteca de clases portable almacenan recursos en archivos .resx que, a continuación, se compilan en archivos .resources y se incrustan en el ensamblado principal o en los ensamblados satélite en tiempo de compilación. Por otro lado, las aplicaciones de la Tienda Windows requieren que los recursos se almacenen en archivos .resw, que se compilan en un archivo de índice de recursos del paquete (PRI) único. Sin embargo, a pesar de los formatos de archivo incompatibles, la Biblioteca de clases portable funcionará en una aplicación de la Tienda Windows.

Para usar la biblioteca de clases desde una aplicación de la Tienda Windows, agregue una referencia a esta en el proyecto de aplicación de la Tienda Windows. Visual Studio extraerá los recursos del ensamblado de forma transparente a un archivo .resw y lo usará para generar un archivo PRI desde el que Windows en tiempo de ejecución puede extraer recursos. En tiempo de ejecución, Windows en tiempo de ejecución ejecuta el código en la Biblioteca de clases portable, pero recupera los recursos de la Biblioteca de clases portable desde el archivo PRI.

Si el proyecto de Biblioteca de clases portable incluye recursos localizados, se usa el modelo de concentrador y radio para implementarlos como se haría con una biblioteca en una aplicación de escritorio. Para consumir el archivo de recursos principal y cualquier archivo de recursos localizado en la aplicación de la Tienda Windows, se agrega una referencia al ensamblado principal. En tiempo de compilación, Visual Studio extrae los recursos del archivo de recursos principal y de cualquier archivo de recursos localizado en archivos .resw independientes. A continuación, compila los archivos .resw en un único archivo PRI al que Windows en tiempo de ejecución obtiene acceso en tiempo de ejecución.

En el siguiente ejemplo sencillo de Biblioteca de clases portable no localizada, se usan recursos para almacenar los nombres de columnas y para determinar el número de caracteres que se van a reservar para los datos tabulares. En el ejemplo se usa un archivo denominado LibResources.resx para almacenar los recursos de cadena que se enumeran en la tabla siguiente.

Nombre del recurso

Valor del recurso

Born

Fecha de nacimiento

BornLength

12

Hired

Fecha de contratación

HiredLength

12

ID

ID

ID.Length

12

Nombre

Nombre

NameLength

25

Title

Base de datos de empleados

El código siguiente define una clase UILibrary que usa el contenedor del Administrador de recursos denominado resources generado por Visual Studio cuando el Modificador de acceso del archivo cambia a Public. La clase UILibrary analiza los datos de cadena según sea necesario. . Tenga en cuenta que la clase está en el espacio de nombres MyCompany.Employees.


using System;
using System.Resources;
using MyCompany.Employees;

[assembly: NeutralResourcesLanguage("en-US")]

namespace MyCompany.Employees
{
   public class UILibrary
   {
      private const int nFields = 4;

      public static string GetTitle()
      {
         string retval = LibResources.Born; 
         if (String.IsNullOrEmpty(retval))
            retval = "";

         return retval;
      }

      public static string[] GetFieldNames()
      {
         string[] fieldnames = new string[nFields];
         fieldnames[0] = LibResources.Name;
         fieldnames[1] = LibResources.ID;
         fieldnames[2] = LibResources.Born;
         fieldnames[3] = LibResources.Hired;
         return fieldnames;
      }

      public static int[] GetFieldLengths()
      {
         int[] fieldLengths = new int[nFields];
         fieldLengths[0] = Int32.Parse(LibResources.NameLength);
         fieldLengths[1] = Int32.Parse(LibResources.IDLength);
         fieldLengths[2] = Int32.Parse(LibResources.BornLength);
         fieldLengths[3] = Int32.Parse(LibResources.HiredLength);
         return fieldLengths;
      }
   }
}


El código siguiente muestra cómo obtener acceso a la clase UILibrary y a sus recursos desde una aplicación de modo de consola. Requiere que se agregue una referencia a UILIbrary.dll al proyecto de aplicación de consola.


using System;
using System.Collections.Generic;
using MyCompany.Employees;

class Program
{
   static void Main()
   {
     // Get the data from some data source.
      var employees = InitializeData();

      // Display application title.
      string title = UILibrary.GetTitle();
      int start = (Console.WindowWidth + title.Length) / 2;
      string titlefmt = String.Format("{{0,{0}{1}", start, "}");
      Console.WriteLine(titlefmt, title);
      Console.WriteLine();

      // Retrieve resources.
      string[] fields = UILibrary.GetFieldNames();
      int[] lengths = UILibrary.GetFieldLengths();
      string fmtString = String.Empty;
      // Create format string for field headers and data.
      for (int ctr = 0; ctr < fields.Length; ctr++)
         fmtString += String.Format("{{{0},-{1}{2}{3}   ", ctr, lengths[ctr], ctr >= 2 ? ":d" : "", "}");

      // Display the headers.
      Console.WriteLine(fmtString, fields);
      Console.WriteLine();
      // Display the data.
      foreach (var e in employees)
         Console.WriteLine(fmtString, e.Item1, e.Item2, e.Item3, e.Item4);

      Console.ReadLine();
   }

   private static List<Tuple<String, String, DateTime, DateTime>> InitializeData() 
   {
      List<Tuple<String, String, DateTime, DateTime>> employees = new List<Tuple<String, String, DateTime, DateTime>>();
      var t1 = Tuple.Create("John", "16302", new DateTime(1954, 8, 18), new DateTime(2006, 9, 8));
      employees.Add(t1);
      t1 = Tuple.Create("Alice", "19745", new DateTime(1995, 5, 10), new DateTime(2012, 10, 17));
      employees.Add(t1);
      return employees;
   }
}


El código siguiente muestra cómo obtener acceso a la clase UILibrary y a sus recursos desde una aplicación de la Tienda Windows. Requiere que se agregue una referencia a UILIbrary.dll al proyecto de aplicación de la Tienda Windows.


using System;
using System.Collections.Generic;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
using MyCompany.Employees;

namespace ConsumerCS
{
    /// <summary>
    /// An empty page that can be used on its own or navigated to within a Frame.
    /// </summary>
    public sealed partial class BlankPage : Page
    {
        public BlankPage()
        {
            this.InitializeComponent();

         }

        /// <summary>
        /// Invoked when this page is about to be displayed in a Frame.
        /// </summary>
        /// <param name="e">Event data that describes how this page was reached.  The Parameter
        /// property is typically used to configure the page.</param>
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
           Example.DisplayData(outputBlock);
       }
    }
}

public class Example
{
    static public void DisplayData(Windows.UI.Xaml.Controls.TextBlock outputBlock)
    {
        // Get the data from some data source.
        var employees = InitializeData();
        outputBlock.FontFamily = new FontFamily("Courier New");      
        // Display application title.
        string title = UILibrary.GetTitle();
        outputBlock.Text += title + Environment.NewLine + Environment.NewLine;

        // Retrieve resources.
        string[] fields = UILibrary.GetFieldNames();
        int[] lengths = UILibrary.GetFieldLengths();
        string fmtString = String.Empty;
        // Create format string for field headers and data.
        for (int ctr = 0; ctr < fields.Length; ctr++)
            fmtString += String.Format("{{{0},-{1}{2}{3}   ", ctr, lengths[ctr], ctr >= 2 ? ":d" : "", "}");

        // Display the headers.
        outputBlock.Text += String.Format(fmtString, fields) + Environment.NewLine + Environment.NewLine;
        // Display the data.
        foreach (var e in employees)
            outputBlock.Text += String.Format(fmtString, e.Item1, e.Item2, e.Item3, e.Item4) + Environment.NewLine;
    }

    private static List<Tuple<String, String, DateTime, DateTime>> InitializeData()
    {
        List<Tuple<String, String, DateTime, DateTime>> employees = new List<Tuple<String, String, DateTime, DateTime>>();
        var t1 = Tuple.Create("John", "16302", new DateTime(1954, 8, 18), new DateTime(2006, 9, 8));
        employees.Add(t1);
        t1 = Tuple.Create("Alice", "19745", new DateTime(1995, 5, 10), new DateTime(2012, 10, 17));
        employees.Add(t1);
        return employees;
    }
}


El siguiente ejemplo de Biblioteca de clases portable localizada incluye recursos para las referencias culturales de francés (Francia) e inglés (Estados Unidos). La referencia cultural inglés (Estados Unidos) es la predeterminada de la aplicación; sus recursos se muestran en la tabla de la sección anterior. El archivo de recursos de la referencia cultural Francés (Francia) se denomina LibResources.fr-FR.resx y consta de los recursos de cadena que se enumeran en la tabla siguiente. El código fuente para la clase UILibrary es el mismo que se muestra en la sección anterior.

Nombre del recurso

Valor del recurso

Born

Date de naissance

BornLength

20

Hired

Date embauché

HiredLength

16

ID

ID

Nombre

Nom

Title

Base de données des employés

El código siguiente muestra cómo obtener acceso a la clase UILibrary y a sus recursos desde una aplicación de modo de consola. Requiere que se agregue una referencia a UILIbrary.dll al proyecto de aplicación de consola.


using System;
using System.Collections.Generic;
using System.Globalization;

using MyCompany.Employees;

class Program
{
   static void Main(string[] args)
   {

      // Get the data from some data source.
      var employees = InitializeData();

      // Display application title.
      string title = UILibrary.GetTitle();
      int start = (Console.WindowWidth + title.Length) / 2;
      string titlefmt = String.Format("{{0,{0}{1}", start, "}");
      Console.WriteLine(titlefmt, title);
      Console.WriteLine();

      // Retrieve resources.
      string[] fields = UILibrary.GetFieldNames();
      int[] lengths = UILibrary.GetFieldLengths();
      string fmtString = String.Empty;
      // Create format string for field headers and data.
      for (int ctr = 0; ctr < fields.Length; ctr++)
         fmtString += String.Format("{{{0},-{1}{2}{3}   ", ctr, lengths[ctr], ctr >= 2 ? ":d" : "", "}");

      // Display the headers.
      Console.WriteLine(fmtString, fields);
      Console.WriteLine();
      // Display the data.
      foreach (var e in employees)
         Console.WriteLine(fmtString, e.Item1, e.Item2, e.Item3, e.Item4);

      Console.ReadLine();
   }

   private static List<Tuple<String, String, DateTime, DateTime>> InitializeData() 
   {
      List<Tuple<String, String, DateTime, DateTime>> employees = new List<Tuple<String, String, DateTime, DateTime>>();
      var t1 = Tuple.Create("John", "16302", new DateTime(1954, 8, 18), new DateTime(2006, 9, 8));
      employees.Add(t1);
      t1 = Tuple.Create("Alice", "19745", new DateTime(1995, 5, 10), new DateTime(2012, 10, 17));
      employees.Add(t1);
      return employees;
   }

}


El código siguiente muestra cómo obtener acceso a la clase UILibrary y a sus recursos desde una aplicación de la Tienda Windows. Requiere que se agregue una referencia a UILIbrary.dll al proyecto de aplicación de la Tienda Windows. Usa la propiedad estática ApplicationLanguages.PrimaryLanguageOverride para establecer el idioma preferido de la aplicación en francés.


using System;
using System.Collections.Generic;
using Windows.Globalization;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
using MyCompany.Employees;

namespace LocConsumerCS
{
    public sealed partial class BlankPage : Page
    {
        public BlankPage()
        {
            this.InitializeComponent();

        }

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            Example.Demo(outputBlock);
        }
    }

    public class Example
    {
        public static void Demo(TextBlock outputBlock)
        {
            // Set the application preferences.
            ApplicationLanguages.PrimaryLanguageOverride = "fr-FR";

            // Get the data from some data source. 
            var employees = InitializeData();
            outputBlock.FontFamily = new FontFamily("Courier New");
            // Display application title.
            string title = UILibrary.GetTitle();
            outputBlock.Text += title + Environment.NewLine + Environment.NewLine; 

            // Retrieve resources.
            string[] fields = UILibrary.GetFieldNames();
            int[] lengths = UILibrary.GetFieldLengths();
            string fmtString = String.Empty;
            // Create format string for field headers and data.
            for (int ctr = 0; ctr < fields.Length; ctr++)
                fmtString += String.Format("{{{0},-{1}{2}{3}   ", ctr, lengths[ctr], ctr >= 2 ? ":d" : "", "}");

            // Display the headers.
            outputBlock.Text += String.Format(fmtString, fields) + Environment.NewLine + Environment.NewLine;

            // Display the data.
            foreach (var e in employees)
                outputBlock.Text += String.Format(fmtString, e.Item1, e.Item2, e.Item3, e.Item4) + Environment.NewLine;
        }

        private static List<Tuple<String, String, DateTime, DateTime>> InitializeData()
        {
            List<Tuple<String, String, DateTime, DateTime>> employees = new List<Tuple<String, String, DateTime, DateTime>>();
            var t1 = Tuple.Create("John", "16302", new DateTime(1954, 8, 18), new DateTime(2006, 9, 8));
            employees.Add(t1);
            t1 = Tuple.Create("Alice", "19745", new DateTime(1995, 5, 10), new DateTime(2012, 10, 17));
            employees.Add(t1);
            return employees;
        }
    }
}


Adiciones de comunidad

AGREGAR
Mostrar:
© 2015 Microsoft