Markieren Sie das Kontrollkästchen Englisch, um die englische Version dieses Artikels anzuzeigen. Sie können den englischen Text auch in einem Popup-Fenster einblenden, indem Sie den Mauszeiger über den Text bewegen.
Übersetzung
Englisch

App-Ressourcen für Bibliotheken, die für mehrere Zielplattformen konfiguriert sind

.NET Framework (current version)
 

Sie können den Projekttyp der portablen Klassenbibliothek von .NET Framework verwenden, um sicherzustellen, dass von mehreren Plattformen auf Ressourcen in den Klassenbibliotheken zugegriffen werden kann.  Dieser Projekttyp ist in Visual Studio 2012 verfügbar, und er ist für die portable Teilmenge der .NET Framework-Klassenbibliothek vorgesehen.  Durch die Verwendung von Portable Klassenbibliothek wird sichergestellt, dass von Desktop-Apps, Silverlight-Apps, Windows Phone-Apps und Windows 8.x Store-Apps auf die Bibliothek zugegriffen werden kann.  

Das Portable Klassenbibliothek-Projekt macht nur eine sehr geringe Teilmenge der Typen im System.Resources-Namespace für die Anwendung verfügbar. Es ermöglicht Ihnen jedoch das Abrufen von Ressourcen mithilfe der ResourceManager-Klasse.  Wenn Sie jedoch eine Anwendung unter Verwendung von Visual Studio erstellen, sollten Sie den von Visual Studio erstellten stark typisierten Wrapper verwenden und nicht die ResourceManager-Klasse direkt verwenden.  

Legen Sie den Zugriffsmodifizierer der Hauptressourcendatei im Visual Studio-Ressourcen-Designer auf Public fest, um einen stark typisierten Wrapper in Visual Studio zu erstellen.  Dadurch wird eine [resourceFileName].designer.cs-Datei oder [resourceFileName].designer.vb-Datei erstellt, die den stark typisierten ResourceManager-Wrapper enthält.  Weitere Informationen zur Verwendung eines stark typisierten Ressourcenwrappers finden Sie im Abschnitt "Generieren einer stark typisierten Ressourcenklasse" unter dem Thema Resgen.exe (Resource File Generator).  

In einem Portable Klassenbibliothek-Projekt wird der gesamte Zugriff auf Ressourcen von der ResourceManager-Klasse behandelt.  Da in einem System.Resources-Projekt nicht auf Typen im ResourceReader-Namespace, z. B. ResourceSet und Portable Klassenbibliothek, zugegriffen werden kann, können sie nicht für den Zugriff auf Ressourcen verwendet werden.  

Das Portable Klassenbibliothek-Projekt enthält die vier ResourceManager-Member, die in der folgenden Tabelle aufgeführt sind.  Diese Konstruktoren und Methoden ermöglichen es Ihnen, ein ResourceManager-Objekt zu instanziieren und Zeichenfolgenressourcen abzurufen.  

ResourceManager-Member

Beschreibung

ResourceManager(String, Assembly)

Erstellt eine ResourceManager-Instanz für den Zugriff auf die benannte Ressourcendatei in der angegebenen Assembly.

ResourceManager(Type)

Erstellt eine ResourceManager-Instanz, die dem angegebenen Typ entspricht.

GetString(String)

Ruft eine benannte Ressource für die aktuelle Kultur ab.

GetString(String, CultureInfo)

Ruft eine benannte Ressource ab, die zu der angegebenen Kultur gehört.

Der Ausschluss anderer ResourceManager-Member aus Portable Klassenbibliothek bedeutet, dass serialisierte Objekte, Daten, die keine Zeichenfolgen sind, und Bilder nicht aus einer Ressourcendatei abgerufen werden können.  Um Ressourcen aus Portable Klassenbibliothek zu verwenden, sollten Sie alle Objektdaten im Zeichenfolgenformat speichern.  Beispielsweise können Sie numerische Werte in einer Ressourcendatei speichern, indem Sie sie in Zeichenfolgen konvertieren. Anschließend können Sie diese abrufen und mit der Parse-Methode oder der TryParse-Methode des numerischen Datentyps zurück in Zahlen konvertieren.  Sie können Bilder oder andere Binärdaten durch Aufruf der Convert.ToBase64String-Methode in eine Zeichenfolgendarstellung konvertieren und sie durch Aufruf der Convert.FromBase64String-Methode als Bytearray wiederherstellen.  

In Portable Klassenbibliothek-Projekten werden Ressourcen in RESX-Dateien gespeichert, die dann als RESOURCES-Dateien kompiliert und zur Kompilierzeit in die Hauptassembly oder in Satellitenassemblys eingebettet werden.  Für Apps im Windows 8.x Store hingegen müssen Ressourcen in RESW-Dateien gespeichert werden, die dann als einzelne PRI (Package Resource Index)-Datei kompiliert werden.  Portable Klassenbibliothek wird jedoch trotz der nicht kompatiblen Dateiformate in einer App im Windows 8.x Store ausgeführt.  

Um die Klassenbibliothek in einer App im Windows 8.x Store zu verwenden, fügen Sie im Projekt für die App im Windows Store einen Verweis auf die Klassenbibliothek hinzu.  Visual Studio extrahiert die Ressourcen transparent aus der Assembly in eine RESW-Datei und verwendet sie zum Generieren einer PRI-Datei, aus der Windows-Runtime Ressourcen extrahieren kann.  Windows-Runtime führt zur Laufzeit den Code in Portable Klassenbibliothek aus, ruft jedoch die Ressourcen der portablen Klassenbibliothek aus der PRI-Datei ab.  

Wenn das Portable Klassenbibliothek-Projekt lokalisierte Ressourcen enthält, stellen Sie diese auf die gleiche Weise wie für eine Bibliothek in einer Desktop-App mithilfe des Hub-and-Spoke-Modells bereit.  Um in der App im Windows 8.x Store die Hauptressourcendatei und ggf. lokalisierte Ressourcendateien zu verwenden, fügen Sie einen Verweis auf die Hauptassembly hinzu.  Zur Kompilierzeit extrahiert Visual Studio die Ressource aus der Hauptressourcendatei und lokalisiert die Ressourcendateien in separate RESW-Dateien.  Anschließend werden die RESW-Dateien in eine einzelne PRI-Datei kompiliert, auf die Windows-Runtime zur Laufzeit zugreift.  

Im folgenden einfachen Beispiel für Portable Klassenbibliothek ohne Lokalisierung werden Ressourcen verwendet, um die Namen von Spalten zu speichern und die Anzahl von Zeichen zu bestimmen, die für Tabellendaten reserviert werden sollen.  Im Beispiel werden die in der folgenden Tabelle aufgeführten Zeichenfolgenressourcen in der Datei LibResources.resx gespeichert.  

Ressourcenname

Ressourcenwert

Born

Birthdate

BornLength

12

Hired

Hire Date

HiredLength

12

ID

ID

ID.Length

12

Name

Name

NameLength

25

Titel

Mitarbeiterdatenbank

Im folgenden Code wird eine UILibrary-Klasse definiert, die den Ressourcen-Manager-Wrapper resources verwendet, der von Visual Studio generiert wird, wenn der Zugriffsmodifizierer für die Datei in Öffentlich geändert wird.  Die UILibrary-Klasse analysiert die Zeichenfolgendaten nach Bedarf.  .  Beachten Sie, dass sich die Klasse im MyCompany.Employees-Namespace befindet.  

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;
      }
   }
}

Im folgenden Code wird veranschaulicht, wie aus einer App im Konsolenmodus auf die UILibrary-Klasse und ihre Ressourcen zugegriffen werden kann.  Dem Konsolen-App-Projekt muss ein Verweis auf UILIbrary.dll hinzugefügt werden.  

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;
   }
}

Im folgenden Code wird veranschaulicht, wie aus einer App im UILibrary auf die Windows 8.x Store-Klasse und ihre Ressourcen zugegriffen werden kann.  Dem Windows Store-App-Projekt muss ein Verweis auf UILIbrary.dll hinzugefügt werden.  

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;
    }
}

Das folgende Beispiel für Portable Klassenbibliothek mit Lokalisierung enthält Ressourcen für die Kulturen Französisch (Frankreich) und Englisch (USA).  Die Kultur Englisch (USA) ist die Standardkultur der App. Ihre Ressourcen werden in der Tabelle im vorherigen Abschnitt gezeigt.  Die Ressourcendatei für die Kultur Französisch (Frankreich) hat den Namen LibResources.fr-FR.resx, und sie besteht aus den Zeichenfolgenressourcen in der folgenden Tabelle.  Der Quellcode für die UILibrary-Klasse ist mit dem Quellcode im vorherigen Abschnitt identisch.  

Ressourcenname

Ressourcenwert

Born

Date de naissance

BornLength

20

Hired

Date embauché

HiredLength

16

ID

ID

Name

Nom

Titel

Base de données des employés

Im folgenden Code wird veranschaulicht, wie aus einer App im Konsolenmodus auf die UILibrary-Klasse und ihre Ressourcen zugegriffen werden kann.  Dem Konsolen-App-Projekt muss ein Verweis auf UILIbrary.dll hinzugefügt werden.  

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;
   }

}

Im folgenden Code wird veranschaulicht, wie aus einer App im UILibrary auf die Windows 8.x Store-Klasse und ihre Ressourcen zugegriffen werden kann.  Dem Windows Store-App-Projekt muss ein Verweis auf UILIbrary.dll hinzugefügt werden.  Mit der statischen ApplicationLanguages.PrimaryLanguageOverride-Eigenschaft wird die bevorzugte Sprache der App auf Französisch festgelegt.  

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;
        }
    }
}
Anzeigen: