ResourceReader ResourceReader ResourceReader ResourceReader Class

Definition

Listet die Ressourcen in einer binären Ressourcendatei (.resources) durch Lesen von sequenziellen Ressourcenname-/Wert-Paaren auf.Enumerates the resources in a binary resources (.resources) file by reading sequential resource name/value pairs.

public ref class ResourceReader sealed : System::Resources::IResourceReader
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class ResourceReader : System.Resources.IResourceReader
type ResourceReader = class
    interface IResourceReader
    interface IEnumerable
    interface IDisposable
Public NotInheritable Class ResourceReader
Implements IResourceReader
Vererbung
ResourceReaderResourceReaderResourceReaderResourceReader
Attribute
Implementiert

Hinweise

Wichtig

Das Aufrufen von Methoden aus dieser Klasse mit nicht vertrauenswürdigen Daten stellt ein Sicherheitsrisiko dar.Calling methods from this class with untrusted data is a security risk. Rufen Sie die Methoden aus dieser Klasse nur mit vertrauenswürdigen Daten auf.Call the methods from this class only with trusted data. Weitere Informationen finden Sie unter Data Validation (Datenüberprüfung).For more information, see Data Validation.

Die ResourceReader -Klasse stellt eine Standardimplementierung von der IResourceReader Schnittstelle.The ResourceReader class provides a standard implementation of the IResourceReader interface. Ein ResourceReader Instanz darstellt, entweder eine eigenständige RESOURCES-Datei oder eine RESOURCES-Datei, die in einer Assembly eingebettet ist.A ResourceReader instance represents either a standalone .resources file or a .resources file that is embedded in an assembly. Es wird zum Auflisten von Ressourcen in eine RESOURCES-Datei und Abrufen von dessen Name/Wert-Paaren.It is used to enumerate the resources in a .resources file and retrieve its name/value pairs. Es unterscheidet sich von der ResourceManager -Klasse, die mit dem angegebene benannten Ressourcen aus einer RESOURCES-Datei abgerufen, die in einer Assembly eingebettet ist.It differs from the ResourceManager class, which is used to retrieve specified named resources from a .resources file that is embedded in an assembly. Die ResourceManager Klasse dient zum Abrufen von Ressourcen, deren Namen im Voraus bekannt sind, während die ResourceReader -Klasse ist hilfreich zum Abrufen von Ressourcen, deren Anzahl oder den genauen Namen sind zum Zeitpunkt der Kompilierung nicht bekannt.The ResourceManager class is used to retrieve resources whose names are known in advance, whereas the ResourceReader class is useful for retrieving resources whose number or precise names are not known at compile time. Beispielsweise kann eine Anwendung eine Ressourcendatei verwenden, um Konfigurationsinformationen zu speichern, die organisiert werden, in den Abschnitten und Elemente in einem Abschnitt, in dem die Anzahl von Abschnitten oder Elemente in einem Abschnitt im Voraus nicht bekannt ist.For example, an application may use a resources file to store configuration information that is organized into sections and items in a section, where the number of sections or items in a section is not known in advance. Ressourcen können dann generisch benannt werden (z. B. Section1, Section1Item1, Section1Item2usw.) und abgerufen, indem Sie mit einer ResourceReader Objekt.Resources can then be named generically (such as Section1, Section1Item1, Section1Item2, and so on) and retrieved by using a ResourceReader object.

Wichtig

Dieser Typ implementiert die IDisposable-Schnittstelle.This type implements the IDisposable interface. Nach Abschluss der Verwendung sollten Sie den Typ entweder direkt oder indirekt löschen.When you have finished using the type, you should dispose of it either directly or indirectly. Zum direkten Löschen des Typs rufen Sie seine Dispose-Methode in einem try/catch-Block auf.To dispose of the type directly, call its Dispose method in a try/catch block. Zum indirekten Löschen verwenden Sie ein Sprachkonstrukt wie using (in C#) oder Using (in Visual Basic).To dispose of it indirectly, use a language construct such as using (in C#) or Using (in Visual Basic). Weitere Informationen finden Sie im Abschnitt „Verwenden eines Objekts, das IDisposable implementiert“ des Themas „Die IDisposable-Schnittstelle“.For more information, see the "Using an Object that Implements IDisposable" section in the IDisposable interface topic.

Weitere Informationen zur Verwendung der ResourceReader Klasse, finden Sie unter den folgenden Abschnitten:For more information about using the ResourceReader class, see the following sections:

Instanziieren eines Objekts ResourceReaderInstantiating a ResourceReader Object

Eine RESOURCES-Datei ist eine binäre Datei, die entweder aus einer Textdatei oder durch eine XML-RESX-Datei kompiliert wurde Resgen.exe (Resource File Generator).A .resources file is a binary file that has been compiled from either a text file or an XML .resx file by Resgen.exe (Resource File Generator). Ein ResourceReader Objekt kann entweder eine eigenständige RESOURCES-Datei oder eine RESOURCES-Datei, die in einer Assembly eingebettet wurde darstellen.A ResourceReader object can represent either a standalone .resources file or a .resources file that has been embedded in an assembly.

Instanziiert eine ResourceReader Objekt, mit dem Lesevorgänge von eigenständigen .resources-Datei, die ResourceReader Konstruktor der Klasse mit einem Eingabestream oder eine Zeichenfolge, die Namen der RESOURCES-Datei enthält.To instantiate a ResourceReader object that reads from a standalone .resources file, use the ResourceReader class constructor with either an input stream or a string that contains the .resources file name. Das folgende Beispiel zeigt beide Ansätze.The following example illustrates both approaches. Die erste instanziiert ein ResourceReader Objekt, das eine RESOURCES-Datei mit dem Namen darstellt Resources1.resources unter Verwendung des Dateinamens.The first instantiates a ResourceReader object that represents a .resources file named Resources1.resources by using its file name. Die zweite instanziiert ein ResourceReader Objekt, das eine RESOURCES-Datei mit dem Namen darstellt Resources2.resources mithilfe eines Datenstroms, der aus der Datei erstellt.The second instantiates a ResourceReader object that represents a .resources file named Resources2.resources by using a stream created from the file.

// Instantiate a standalone .resources file from its filename.
var rr1 = new System.Resources.ResourceReader("Resources1.resources");

// Instantiate a standalone .resources file from a stream.
var fs = new System.IO.FileStream(@".\Resources2.resources",
                                  System.IO.FileMode.Open);
var rr2 = new System.Resources.ResourceReader(fs);      
' Instantiate a standalone .resources file from its filename.
Dim rr1 As New System.Resources.ResourceReader("Resources1.resources")

' Instantiate a standalone .resources file from a stream.
Dim fs As New System.IO.FileStream(".\Resources2.resources",
                                   System.IO.FileMode.Open)
Dim rr2 As New System.Resources.ResourceReader(fs)      

Zum Erstellen einer ResourceReader instanziieren-Objekt, das eine eingebettete RESOURCES-Datei, stellt eine Assembly Objekt aus der Assembly, in dem die RESOURCES-Datei eingebettet ist.To create a ResourceReader object that represents an embedded .resources file, instantiate an Assembly object from the assembly in which the .resources file is embedded. Die Assembly.GetManifestResourceStream Methode gibt eine Stream -Objekt, das übergeben werden kann die ResourceReader(Stream) Konstruktor.Its Assembly.GetManifestResourceStream method returns a Stream object that can be passed to the ResourceReader(Stream) constructor. Das folgende Beispiel instanziiert ein ResourceReader -Objekt, das eine eingebettete RESOURCES-Datei darstellt.The following example instantiates a ResourceReader object that represents an embedded .resources file.

System.Reflection.Assembly assem = 
             System.Reflection.Assembly.LoadFrom(@".\MyLibrary.dll"); 
System.IO.Stream fs = 
             assem.GetManifestResourceStream("MyCompany.LibraryResources.resources");
var rr = new System.Resources.ResourceReader(fs); 
Dim assem As System.Reflection.Assembly = 
             System.Reflection.Assembly.LoadFrom(".\MyLibrary.dll") 
Dim fs As System.IO.Stream = 
             assem.GetManifestResourceStream("MyCompany.LibraryResources.resources")
Dim rr As New System.Resources.ResourceReader(fs) 

Auflisten von Ressourcen des Objekts ein ResourceReaderEnumerating a ResourceReader Object's Resources

Rufen Sie zum Auflisten von Ressourcen in eine RESOURCES-Datei der GetEnumerator -Methode, die gibt ein System.Collections.IDictionaryEnumerator Objekt.To enumerate the resources in a .resources file, you call the GetEnumerator method, which returns an System.Collections.IDictionaryEnumerator object. Rufen Sie die IDictionaryEnumerator.MoveNext Methode, um aus einer Ressource zum nächsten zu wechseln.You call the IDictionaryEnumerator.MoveNext method to move from one resource to the next. Gibt die Methode zurück false Wenn haben alle Ressourcen in die RESOURCES-Datei aufgelistet wurden.The method returns false when all the resources in the .resources file have been enumerated.

Hinweis

Obwohl die ResourceReader -Klasse implementiert die IEnumerable Schnittstelle und die IEnumerable.GetEnumerator -Methode, die ResourceReader.GetEnumerator Methode bietet keine die IEnumerable.GetEnumerator Implementierung.Although the ResourceReader class implements the IEnumerable interface and the IEnumerable.GetEnumerator method, the ResourceReader.GetEnumerator method does not provide the IEnumerable.GetEnumerator implementation. Stattdessen die ResourceReader.GetEnumerator Methode gibt ein IDictionaryEnumerator Schnittstellenobjekts, das Zugriff auf jede Ressource Name-Wert-Paar bereitstellt.Instead, the ResourceReader.GetEnumerator method returns an IDictionaryEnumerator interface object that provides access to each resource's name/value pair.

Sie können die einzelnen Ressourcen in der Auflistung auf zwei Arten abrufen:You can retrieve the individual resources in the collection in two ways:

Abrufen von Ressourcen mithilfe von IDictionaryEnumerator-EigenschaftenRetrieving Resources by Using IDictionaryEnumerator Properties

Die erste Methode zum Auflisten von Ressourcen in eine RESOURCES-Datei wird direkt jeder Ressource Name/Wert-Paar.The first method of enumerating the resources in a .resources file involves directly retrieving each resource's name/value pair. Nach dem Aufrufen der IDictionaryEnumerator.MoveNext -Methode auf jede Ressource in der Auflistung zu verschieben, können Sie abrufen, die Ressource zu benennen, aus der IDictionaryEnumerator.Key -Eigenschaft und die Ressourcendaten aus der IDictionaryEnumerator.Value Eigenschaft.After you call the IDictionaryEnumerator.MoveNext method to move to each resource in the collection, you can retrieve the resource name from the IDictionaryEnumerator.Key property and the resource data from the IDictionaryEnumerator.Value property.

Das folgende Beispiel zeigt, wie zum Abrufen von Name und Wert der einzelnen Ressourcen in eine RESOURCES-Datei mithilfe der IDictionaryEnumerator.Key und IDictionaryEnumerator.Value Eigenschaften.The following example shows how to retrieve the name and value of each resource in a .resources file by using the IDictionaryEnumerator.Key and IDictionaryEnumerator.Value properties. Um das Beispiel auszuführen, erstellen Sie die folgende Textdatei, die mit dem Namen ApplicationResources.txt Zeichenfolgenressourcen definieren.To run the example, create the following text file named ApplicationResources.txt to define string resources.

Title="Contact Information"  
Label1="First Name:"  
Label2="Middle Name:"  
Label3="Last Name:"  
Label4="SSN:"  
Label5="Street Address:"  
Label6="City:"  
Label7="State:"  
Label8="Zip Code:"  
Label9="Home Phone:"  
Label10="Business Phone:"  
Label11="Mobile Phone:"  
Label12="Other Phone:"  
Label13="Fax:"  
Label14="Email Address:"  
Label15="Alternate Email Address:"  

Sie können dann die Text-Ressourcendatei in eine Binärdatei, die mit dem Namen ApplicationResources.resources mithilfe des folgenden Befehls konvertieren:You can then convert the text resource file to a binary file named ApplicationResources.resources by using the following command:

Resgen ApplicationResources.txtresgen ApplicationResources.txt

Im folgenden Beispiel wird, klicken Sie dann die ResourceReader Klasse, um jede Ressource in der eigenständigen binäre RESOURCES-Datei aufgelistet werden und um die Schlüsselnamen und den entsprechenden Wert anzuzeigen.The following example then uses the ResourceReader class to enumerate each resource in the standalone binary .resources file and to display its key name and corresponding value.

using System;
using System.Collections;
using System.Resources;

public class Example
{
   public static void Main()
   {
      Console.WriteLine("Resources in ApplicationResources.resources:");
      ResourceReader res = new ResourceReader(@".\ApplicationResources.resources");
      IDictionaryEnumerator dict = res.GetEnumerator();
      while (dict.MoveNext())
         Console.WriteLine("   {0}: '{1}' (Type {2})", 
                           dict.Key, dict.Value, dict.Value.GetType().Name);
      res.Close();
   }
}
// The example displays the following output:
//       Resources in ApplicationResources.resources:
//          Label3: '"Last Name:"' (Type String)
//          Label2: '"Middle Name:"' (Type String)
//          Label1: '"First Name:"' (Type String)
//          Label7: '"State:"' (Type String)
//          Label6: '"City:"' (Type String)
//          Label5: '"Street Address:"' (Type String)
//          Label4: '"SSN:"' (Type String)
//          Label9: '"Home Phone:"' (Type String)
//          Label8: '"Zip Code:"' (Type String)
//          Title: '"Contact Information"' (Type String)
//          Label12: '"Other Phone:"' (Type String)
//          Label13: '"Fax:"' (Type String)
//          Label10: '"Business Phone:"' (Type String)
//          Label11: '"Mobile Phone:"' (Type String)
//          Label14: '"Email Address:"' (Type String)
//          Label15: '"Alternate Email Address:"' (Type String)
Imports System.Collections
Imports System.Resources

Module Example
   Public Sub Main()
      Console.WriteLine("Resources in ApplicationResources.resources:")
      Dim res As New ResourceReader(".\ApplicationResources.resources")
      Dim dict As IDictionaryEnumerator = res.GetEnumerator()
      Do While dict.MoveNext()
         Console.WriteLine("   {0}: '{1}' (Type {2})", dict.Key, dict.Value, dict.Value.GetType().Name)
      Loop
      res.Close()
   End Sub
End Module
' The example displays output like the following:
'       Resources in ApplicationResources.resources:
'          Label3: '"Last Name:"' (Type String)
'          Label2: '"Middle Name:"' (Type String)
'          Label1: '"First Name:"' (Type String)
'          Label7: '"State:"' (Type String)
'          Label6: '"City:"' (Type String)
'          Label5: '"Street Address:"' (Type String)
'          Label4: '"SSN:"' (Type String)
'          Label9: '"Home Phone:"' (Type String)
'          Label8: '"Zip Code:"' (Type String)
'          Title: '"Contact Information"' (Type String)
'          Label12: '"Other Phone:"' (Type String)
'          Label13: '"Fax:"' (Type String)
'          Label10: '"Business Phone:"' (Type String)
'          Label11: '"Mobile Phone:"' (Type String)
'          Label14: '"Email Address:"' (Type String)
'          Label15: '"Alternate Email Address:"' (Type String)

Der Versuch zum Abrufen von Ressourcendaten aus der IDictionaryEnumerator.Value Eigenschaft kann die folgenden Ausnahmen auslösen:The attempt to retrieve resource data from the IDictionaryEnumerator.Value property can throw the following exceptions:

In der Regel sind diese Ausnahmen ausgelöst, wenn die RESOURCES-Datei manuell geändert wurde, wenn die Assembly, in der ein Typ definiert ist, entweder nicht in einer Anwendung enthalten wurde, oder versehentlich gelöscht wurde oder die Assembly mit einer älteren Version vorliegt, die ist ein Vorläufer des ein Typ.Typically, these exceptions are thrown if the .resources file has been modified manually, if the assembly in which a type is defined has either not been included with an application or has been inadvertently deleted, or if the assembly is an older version that predates a type. Wenn eine dieser Ausnahmen ausgelöst wird, können Sie Ressourcen abrufen, indem Auflisten von jeder Ressource und das Aufrufen der GetResourceData Methode, wie im folgenden Abschnitt gezeigt.If one of these exceptions is thrown, you can retrieve resources by enumerating each resource and calling the GetResourceData method, as the following section shows. Dieser Ansatz bietet Sie einige Informationen zu den Daten eingeben, die die IDictionaryEnumerator.Value versucht-Eigenschaft zurück.This approach provides you with some information about the data type that the IDictionaryEnumerator.Value property attempted to return.

Abrufen von Ressourcen anhand des Namens mit GetResourceDataRetrieving Resources by Name with GetResourceData

Der zweite Ansatz zum Auflisten von Ressourcen in eine RESOURCES-Datei auch umfasst das Navigieren durch die Ressourcen in der Datei durch Aufrufen der IDictionaryEnumerator.MoveNext Methode.The second approach to enumerating resources in a .resources file also involves navigating through the resources in the file by calling the IDictionaryEnumerator.MoveNext method. Für jede Ressource, rufen Sie den Namen der Ressource aus der IDictionaryEnumerator.Key -Eigenschaft, die dann an die GetResourceData(String, String, Byte[]) Methode, um die Daten der Ressource abzurufen.For each resource, you retrieve the resource's name from the IDictionaryEnumerator.Key property, which is then passed to the GetResourceData(String, String, Byte[]) method to retrieve the resource's data. Als Byte-Array im Rückgabewert die resourceData Argument.This is returned as a byte array in the resourceData argument.

Dieser Ansatz ist umständlicher als das Abrufen von den Ressourcennamen und der Wert aus der IDictionaryEnumerator.Key und IDictionaryEnumerator.Value Eigenschaften, da es sich um die tatsächlichen Bytes zurückgibt, die den Ressourcenwert bilden.This approach is more awkward than retrieving the resource name and value from the IDictionaryEnumerator.Key and IDictionaryEnumerator.Value properties, because it returns the actual bytes that form the resource value. Jedoch, wenn der Versuch zum Abrufen der Ressource eine Ausnahme auslöst, die GetResourceData Methode können Sie identifizieren die Quelle der Ausnahme durch Angabe von Informationen zu Datentyp der Ressource.However, if the attempt to retrieve the resource throws an exception, the GetResourceData method can help identify the source of the exception by supplying information about the resource's data type. Weitere Informationen zu die Zeichenfolge, die den Datentyp der Ressource angibt, finden Sie unter GetResourceData.For more information about the string that indicates the resource's data type, see GetResourceData.

Das folgende Beispiel veranschaulicht, wie Sie diesen Ansatz verwenden, um Ressourcen abzurufen und um alle Ausnahmen zu behandeln, die ausgelöst werden.The following example illustrates how to use this approach to retrieve resources and to handle any exceptions that are thrown. Es erstellt programmgesteuert eine binäre RESOURCES-Datei mit vier Zeichenfolgen, ein boolescher Wert, eine ganze Zahl, eine Bitmap und benutzerdefinierte DateTimeTZI Objekt.It programmatically creates a binary .resources file that contains four strings, one Boolean, one integer, one bitmap, and one custom DateTimeTZI object. Um das Beispiel auszuführen, führen Sie folgende Schritte aus:To run the example, do the following:

  1. Erstellen Sie eine Assembly mit dem Namen Library.dll, die enthält die DateTimeTZI Struktur.Create an assembly named Library.dll that contains the DateTimeTZI structure. Folgendes ist der Quellcode für die Assembly.The following is the source code for the assembly.

    using System;
    
    [Serializable] public struct DateTimeTZI
    {
      DateTime Date;
      TimeZoneInfo TimeZone;
       
      public DateTimeTZI(DateTime date, TimeZoneInfo tz)
      {
         this.Date = date;
         this.TimeZone = tz;
      }
    
       public override string ToString()
       {
         return String.Format("{0:dd/MM/yyyy hh:mm:ss tt} {1}", 
                              Date, TimeZone.StandardName);
       }
    }
    
    <Serializable> Public Structure DateTimeTZI
      Dim [Date] As DateTime
      Dim TimeZone As TimeZoneInfo
       
      Public Sub New([date] As DateTime, tz As TimeZoneInfo)
         Me.[Date] = [date]
         Me.TimeZone = tz
      End Sub
      
      Public Overrides Function ToString() As String
         Return String.Format("{0:dd/MM/yyyy hh:mm:ss tt} {1}", 
                              [Date], TimeZone.StandardName)
      End Function
    End Structure
    

    Kompilieren Sie den Quellcode in c# mithilfe des folgenden Befehls:Compile the source code in C# by using the following command:

    csc /t:library library.cs  
    

    Oder Sie können es in Visual Basic kompilieren, mithilfe des folgenden Befehls:Or, you can compile it in Visual Basic by using the following command:

    vbc library.vb /t:library  
    
  2. Kompilieren Sie und führen Sie den folgenden Quellcode, der eine RESOURCES-Datei mit dem Namen ContactResources.resources erstellt.Compile and execute the following source code, which creates a .resources file named ContactResources.resources.

    using System;
    using System.Drawing;
    using System.Drawing.Imaging;
    using System.IO;
    using System.Resources;
    using System.Runtime.Serialization.Formatters.Binary;
    using System.Text;
    
    
    public class Example
    {
       public static void Main()
       {
          // Bitmap as stream.
          MemoryStream bitmapStream = new MemoryStream();
          Bitmap bmp = new Bitmap(@".\ContactsIcon.jpg");
          bmp.Save(bitmapStream, ImageFormat.Jpeg);
              
          // Define resources to be written.
          using (ResourceWriter rw = new ResourceWriter(@".\ContactResources.resources"))
          {
             rw.AddResource("Title", "Contact List");
             rw.AddResource("NColumns", 5);         
             rw.AddResource("Icon", bitmapStream);         
             rw.AddResource("Header1", "Name");
             rw.AddResource("Header2", "City");
             rw.AddResource("Header3", "State");  
             rw.AddResource("VersionDate", new DateTimeTZI(
                            new DateTime(2012, 5, 18),  
                            TimeZoneInfo.Local));
             rw.AddResource("ClientVersion", true);
             rw.Generate();
          }
       }
    }
    
    Imports System.Drawing
    Imports System.IO
    Imports System.Resources
    Imports System.Runtime.Serialization.Formatters.Binary
    
    Imports System.Text
    
    Module Example
       Public Sub Main()
          ' Bitmap as stream.
          Dim bitmapStream As New MemoryStream()
          Dim bmp As New Bitmap(".\ContactsIcon.jpg")
          bmp.Save(bitmapStream, Imaging.ImageFormat.jpeg)
              
          ' Define resources to be written.
          Using rw As New ResourceWriter(".\ContactResources.resources")
             rw.AddResource("Title", "Contact List")
             rw.AddResource("NColumns", 5)         
             rw.AddResource("Icon", bitmapStream)         
             rw.AddResource("Header1", "Name")
             rw.AddResource("Header2", "City")
             rw.AddResource("Header3", "State")  
             rw.AddResource("VersionDate", New DateTimeTZI(#05/18/2012#, 
                                                           TimeZoneInfo.Local))
             rw.AddResource("ClientVersion", True)
             rw.Generate()
          End Using
       End Sub
    End Module
    

    Die Quellcodedatei Namen CreateResources.cs.The source code file is named CreateResources.cs. Sie können es in C# -Code kompilieren, mithilfe des folgenden Befehls:You can compile it in C# by using the following command:

    csc CreateResources.cs /r:library.dll  
    

    Oder Sie können es in Visual Basic kompilieren, mithilfe des folgenden Befehls:Or, you can compile it in Visual Basic by using the following command:

    vbc CreateResources.vb /r:library.dll  
    
  3. Kompilieren Sie und führen Sie den folgenden Code zum Auflisten der Ressourcen in der Datei ContactResources.resources.Compile and run the following code to enumerate the resources in the ContactResources.resources file.

    using System;
    using System.Collections;
    using System.Drawing;
    using System.IO;
    using System.Resources;
    using System.Runtime.Serialization.Formatters.Binary;
    
    public class Example
    {
       public static void Main()
       {
          ResourceReader rdr = new ResourceReader(@".\ContactResources.resources");  
          IDictionaryEnumerator dict = rdr.GetEnumerator();
          while (dict.MoveNext()) {
             Console.WriteLine("Resource Name: {0}", dict.Key);
             try {
                Console.WriteLine("   Value: {0}", dict.Value);
             }
             catch (FileNotFoundException) {
                Console.WriteLine("   Exception: A file cannot be found.");
                DisplayResourceInfo(rdr, (string) dict.Key, false);
             }
             catch (FormatException) {
                Console.WriteLine("   Exception: Corrupted data.");
                DisplayResourceInfo(rdr, (string) dict.Key, true);
             }
             catch (TypeLoadException) {
                Console.WriteLine("   Exception: Cannot load the data type.");
                DisplayResourceInfo(rdr, (string) dict.Key, false);   
             }
          } 
       }
    
       private static void DisplayResourceInfo(ResourceReader rr, 
                                       string key, bool loaded)
       {                                
          string dataType = null;
          byte[] data = null;
          rr.GetResourceData(key, out dataType, out data);
                
          // Display the data type.
          Console.WriteLine("   Data Type: {0}", dataType);
          // Display the bytes that form the available data.      
          Console.Write("   Data: ");
          int lines = 0;
          foreach (var dataItem in data) {
             lines++;
             Console.Write("{0:X2} ", dataItem);
             if (lines % 25 == 0)
                Console.Write("\n         ");
          }
          Console.WriteLine();
          // Try to recreate current state of  data.
          // Do: Bitmap, DateTimeTZI
          switch (dataType) 
          {  
             // Handle internally serialized string data (ResourceTypeCode members).
             case "ResourceTypeCode.String":
                BinaryReader reader = new BinaryReader(new MemoryStream(data));
                string binData = reader.ReadString();
                Console.WriteLine("   Recreated Value: {0}", binData);
                break;
             case "ResourceTypeCode.Int32":
                Console.WriteLine("   Recreated Value: {0}", 
                                  BitConverter.ToInt32(data, 0));
                break;
             case "ResourceTypeCode.Boolean":
                Console.WriteLine("   Recreated Value: {0}", 
                                  BitConverter.ToBoolean(data, 0));
                break;
             // .jpeg image stored as a stream.
             case "ResourceTypeCode.Stream":  
                const int OFFSET = 4;
                int size = BitConverter.ToInt32(data, 0);
                Bitmap value1 = new Bitmap(new MemoryStream(data, OFFSET, size));
                Console.WriteLine("   Recreated Value: {0}", value1); 
                break;
             // Our only other type is DateTimeTZI.
             default:
                // No point in deserializing data if the type is unavailable.
                if (dataType.Contains("DateTimeTZI") && loaded) { 
                   BinaryFormatter binFmt = new BinaryFormatter();
                   object value2 = binFmt.Deserialize(new MemoryStream(data));
                   Console.WriteLine("   Recreated Value: {0}", value2);
                }    
                break;
          }
          Console.WriteLine();
       }
    }
    
    Imports System.Collections
    Imports System.Drawing
    Imports System.IO
    Imports System.Resources
    Imports System.Runtime.Serialization.Formatters.Binary
    
    Module Example
       Public Sub Main()
          Dim rdr As New ResourceReader(".\ContactResources.resources")  
          Dim dict As IDictionaryEnumerator = rdr.GetEnumerator()
          Do While dict.MoveNext()
             Console.WriteLine("Resource Name: {0}", dict.Key)
             Try
                Console.WriteLine("   Value: {0}", dict.Value)
             Catch e As FileNotFoundException
                Console.WriteLine("   Exception: A file cannot be found.")
                DisplayResourceInfo(rdr, CStr(dict.Key), False)
             Catch e As FormatException
                Console.WriteLine("   Exception: Corrupted data.")
                DisplayResourceInfo(rdr, CStr(dict.Key), True)
             Catch e As TypeLoadException
                Console.WriteLine("   Exception: Cannot load the data type.")
                DisplayResourceInfo(rdr, CStr(dict.Key), False)   
             End Try
          Loop 
       End Sub
    
       Private Sub DisplayResourceInfo(rr As ResourceReader, 
                                       key As String, loaded As Boolean)
          Dim dataType As String = Nothing
          Dim data() As Byte = Nothing
          rr.GetResourceData(key, dataType, data)
                
          ' Display the data type.
          Console.WriteLine("   Data Type: {0}", dataType)
          ' Display the bytes that form the available data.      
          Console.Write("   Data: ")
          Dim lines As Integer = 0
          For Each dataItem In data
             lines += 1
             Console.Write("{0:X2} ", dataItem)
             If lines Mod 25 = 0 Then Console.Write("{0}         ", vbCrLf)
          Next
          Console.WriteLine()
          ' Try to recreate current state of  data.
          ' Do: Bitmap, DateTimeTZI
          Select Case dataType   
             ' Handle internally serialized string data (ResourceTypeCode members).
             Case "ResourceTypeCode.String"
                Dim reader As New BinaryReader(New MemoryStream(data))
                Dim binData As String = reader.ReadString()
                Console.WriteLine("   Recreated Value: {0}", binData)
             Case "ResourceTypeCode.Int32"
                Console.WriteLine("   Recreated Value: {0}", 
                                  BitConverter.ToInt32(data, 0))
             Case "ResourceTypeCode.Boolean"
                Console.WriteLine("   Recreated Value: {0}", 
                                  BitConverter.ToBoolean(data, 0))
             ' .jpeg image stored as a stream.
             Case "ResourceTypeCode.Stream"  
                Const OFFSET As Integer = 4
                Dim size As Integer = BitConverter.ToInt32(data, 0)
                Dim value As New Bitmap(New MemoryStream(data, OFFSET, size))
                Console.WriteLine("   Recreated Value: {0}", value) 
             ' Our only other type is DateTimeTZI.
             Case Else
                ' No point in deserializing data if the type is unavailable.
                If dataType.Contains("DateTimeTZI") And loaded Then 
                   Dim binFmt As New BinaryFormatter()
                   Dim value As Object = binFmt.Deserialize(New MemoryStream(data))
                   Console.WriteLine("   Recreated Value: {0}", value)
                End If    
          End Select
          Console.WriteLine()
       End Sub
    End Module
    

    Nach der Änderung des Quellcodes (z. B. durch Auslösen von absichtlich eine FormatException am Ende der try Block) oder Umbenennen von der Assembly Library.dll, damit es zur Laufzeit nicht verfügbar ist, können Sie das Beispiel finden Sie unter ausführen wie Aufrufe von GetResourceData ermöglichen Sie abrufen oder erstellen Sie einige Informationen zur Ressource neu.After modifying the source code (for example, by deliberately throwing a FormatException at the end of the try block) or renaming the Library.dll assembly so that it is unavailable at runtime, you can run the example to see how calls to GetResourceData enable you to retrieve or recreate some resource information.

Konstruktoren

ResourceReader(Stream) ResourceReader(Stream) ResourceReader(Stream) ResourceReader(Stream)

Initialisiert eine neue Instanz der ResourceReader-Klasse für den angegebenen Stream.Initializes a new instance of the ResourceReader class for the specified stream.

ResourceReader(String) ResourceReader(String) ResourceReader(String) ResourceReader(String)

Initialisiert eine neue Instanz der ResourceReader-Klasse für die angegebene benannten Ressourcendatei.Initializes a new instance of the ResourceReader class for the specified named resource file.

Methoden

Close() Close() Close() Close()

Gibt alle diesem ResourceReader-Objekt zugeordneten Ressourcen des Betriebssystems frei.Releases all operating system resources associated with this ResourceReader object.

Dispose() Dispose() Dispose() Dispose()

Gibt alle von der aktuellen Instanz der ResourceReader-Klasse verwendeten Ressourcen frei.Releases all resources used by the current instance of the ResourceReader class.

Equals(Object) Equals(Object) Equals(Object) Equals(Object)

Bestimmt, ob das angegebene Objekt mit dem aktuellen Objekt identisch ist.Determines whether the specified object is equal to the current object.

(Inherited from Object)
GetEnumerator() GetEnumerator() GetEnumerator() GetEnumerator()

Gibt ein Enumerator für dieses ResourceReader-Objekt zurück.Returns an enumerator for this ResourceReader object.

GetHashCode() GetHashCode() GetHashCode() GetHashCode()

Fungiert als Standardhashfunktion.Serves as the default hash function.

(Inherited from Object)
GetResourceData(String, String, Byte[]) GetResourceData(String, String, Byte[]) GetResourceData(String, String, Byte[]) GetResourceData(String, String, Byte[])

Ruft den Typnamen und die Daten einer benannten Ressource aus einer geöffneten Ressourcendatei oder einem geöffneten Stream ab.Retrieves the type name and data of a named resource from an open resource file or stream.

GetType() GetType() GetType() GetType()

Ruft den Type der aktuellen Instanz ab.Gets the Type of the current instance.

(Inherited from Object)
MemberwiseClone() MemberwiseClone() MemberwiseClone() MemberwiseClone()

Erstellt eine flache Kopie des aktuellen Object.Creates a shallow copy of the current Object.

(Inherited from Object)
ToString() ToString() ToString() ToString()

Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt.Returns a string that represents the current object.

(Inherited from Object)

Explizite Schnittstellenimplementierungen

IDisposable.Dispose() IDisposable.Dispose() IDisposable.Dispose() IDisposable.Dispose()

Gibt die von der ResourceReader verwendeten Ressourcen frei.Releases the resources used by the ResourceReader.

IEnumerable.GetEnumerator() IEnumerable.GetEnumerator() IEnumerable.GetEnumerator() IEnumerable.GetEnumerator()

Gibt ein Enumerator für dieses ResourceReader-Objekt zurück.Returns an enumerator for this ResourceReader object.

Extension Methods

Cast<TResult>(IEnumerable) Cast<TResult>(IEnumerable) Cast<TResult>(IEnumerable) Cast<TResult>(IEnumerable)

Wandelt die Elemente eines IEnumerable in den angegebenen Typ umCasts the elements of an IEnumerable to the specified type.

OfType<TResult>(IEnumerable) OfType<TResult>(IEnumerable) OfType<TResult>(IEnumerable) OfType<TResult>(IEnumerable)

Filtert die Elemente eines IEnumerable anhand eines angegebenen TypsFilters the elements of an IEnumerable based on a specified type.

AsParallel(IEnumerable) AsParallel(IEnumerable) AsParallel(IEnumerable) AsParallel(IEnumerable)

Ermöglicht die Parallelisierung einer Abfrage.Enables parallelization of a query.

AsQueryable(IEnumerable) AsQueryable(IEnumerable) AsQueryable(IEnumerable) AsQueryable(IEnumerable)

Konvertiert eine IEnumerable auf eine IQueryable.Converts an IEnumerable to an IQueryable.

Gilt für: