ResourceReader ResourceReader ResourceReader ResourceReader Class

Определение

Перечисляет ресурсы в двоичном файле ресурсов (RESOURCES) путем последовательного считывания пар "ключ-значение" ресурсов.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
Наследование
ResourceReaderResourceReaderResourceReaderResourceReader
Атрибуты
Реализации

Комментарии

Важно!

Вызов методов этого класса для ненадежных данных представляет угрозу безопасности.Calling methods from this class with untrusted data is a security risk. Вызывайте методы класса только для надежных данных.Call the methods from this class only with trusted data. Дополнительные сведения: Data Validation (Проверка данных).For more information, see Data Validation.

ResourceReader Класс предоставляет стандартную реализацию IResourceReader интерфейс.The ResourceReader class provides a standard implementation of the IResourceReader interface. Объект ResourceReader экземпляр представляет автономный RESOURCES-файла или файла .resources, внедренного в сборку.A ResourceReader instance represents either a standalone .resources file or a .resources file that is embedded in an assembly. Он позволяет перечислить ресурсы в RESOURCES-файла и извлечь его пары "имя значение".It is used to enumerate the resources in a .resources file and retrieve its name/value pairs. Он отличается от ResourceManager класс, который используется для получения указанных именованных ресурсов из RESOURCES-файла, внедренного в сборку.It differs from the ResourceManager class, which is used to retrieve specified named resources from a .resources file that is embedded in an assembly. ResourceManager Класс используется для извлечения ресурсов, имена которых известны заранее, тогда как ResourceReader класс полезен для извлечения ресурсов, которого номер или точные имена не известны во время компиляции.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. Например приложение может использовать файл ресурсов для хранения сведений о конфигурации, организованных в разделах и элементов в разделе, когда количество разделов или элементов в разделе, не известен заранее.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. Ресурсы могут называться затем универсально (такие как Section1, Section1Item1, Section1Item2, и так далее) и получать с помощью ResourceReader объекта.Resources can then be named generically (such as Section1, Section1Item1, Section1Item2, and so on) and retrieved by using a ResourceReader object.

Важно!

Этот тип реализует IDisposable интерфейс.This type implements the IDisposable interface. Когда вы закончите, используя тип, следует освободить его прямо или косвенно.When you have finished using the type, you should dispose of it either directly or indirectly. Чтобы удалить тип напрямую, вызовите его Dispose метод в try / catch блока.To dispose of the type directly, call its Dispose method in a try/catch block. Чтобы избавиться от его косвенно, используйте языковой конструкции, такие как using (в C#) или Using (в Visual Basic).To dispose of it indirectly, use a language construct such as using (in C#) or Using (in Visual Basic). Дополнительные сведения см. в разделе «С помощью объекта, реализует IDisposable» IDisposable разделу интерфейса.For more information, see the "Using an Object that Implements IDisposable" section in the IDisposable interface topic.

Дополнительные сведения об использовании ResourceReader класса, в следующих разделах:For more information about using the ResourceReader class, see the following sections:

Создание экземпляра объекта ResourceReaderInstantiating a ResourceReader Object

RESOURCES-файл является двоичным файлом, который был скомпилирован из текстового файла или XML-файл .resx с Resgen.exe (генератор файлов ресурсов).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). Объект ResourceReader объект может представлять отдельном Resources-файле или в RESOURCES-файл, встроенный в сборку.A ResourceReader object can represent either a standalone .resources file or a .resources file that has been embedded in an assembly.

Для создания экземпляра ResourceReader который операции чтения из автономного RESOURCES-файл, использовать ResourceReader конструктора класса входного потока или строка, содержащая имя файла .resources.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. В следующем примере оба подхода.The following example illustrates both approaches. Создает экземпляр первый ResourceReader , представляющий RESOURCES-файл с именем Resources1.resources с помощью имени файла.The first instantiates a ResourceReader object that represents a .resources file named Resources1.resources by using its file name. Создает второй ResourceReader , представляющий RESOURCES-файл с именем Resources2.resources с помощью потока, созданного из файла.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)      

Чтобы создать ResourceReader , представляющий внедренный RESOURCES-файл, создать экземпляр Assembly объекта из сборки, в который внедрены RESOURCES-файл.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. Его Assembly.GetManifestResourceStream возвращает Stream объект, который может быть передан в ResourceReader(Stream) конструктор.Its Assembly.GetManifestResourceStream method returns a Stream object that can be passed to the ResourceReader(Stream) constructor. В следующем примере создается ResourceReader , представляющий внедренный RESOURCES-файл.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) 

Перечисление ресурсов объект ResourceReaderEnumerating a ResourceReader Object's Resources

Чтобы перечислить ресурсы в RESOURCES-файл, вызовите GetEnumerator метод, возвращающий System.Collections.IDictionaryEnumerator объекта.To enumerate the resources in a .resources file, you call the GetEnumerator method, which returns an System.Collections.IDictionaryEnumerator object. Вы вызываете IDictionaryEnumerator.MoveNext метод для перехода из одного ресурса к другому.You call the IDictionaryEnumerator.MoveNext method to move from one resource to the next. Этот метод возвращает false при были перечислены все ресурсы в RESOURCES-файл.The method returns false when all the resources in the .resources file have been enumerated.

Примечание

Несмотря на то что ResourceReader класс реализует IEnumerable интерфейс и IEnumerable.GetEnumerator метод, ResourceReader.GetEnumerator метод не предоставляет IEnumerable.GetEnumerator реализации.Although the ResourceReader class implements the IEnumerable interface and the IEnumerable.GetEnumerator method, the ResourceReader.GetEnumerator method does not provide the IEnumerable.GetEnumerator implementation. Вместо этого ResourceReader.GetEnumerator возвращает метод IDictionaryEnumerator объект интерфейса, который предоставляет доступ к паре имя значение для каждого ресурса.Instead, the ResourceReader.GetEnumerator method returns an IDictionaryEnumerator interface object that provides access to each resource's name/value pair.

Можно получить отдельные ресурсы коллекции одним из двух способов:You can retrieve the individual resources in the collection in two ways:

  • Можно выполнить итерацию каждого ресурса в System.Collections.IDictionaryEnumerator сбора и использования System.Collections.IDictionaryEnumerator свойств для извлечения ресурсов имя и значение.You can iterate each resource in the System.Collections.IDictionaryEnumerator collection and use System.Collections.IDictionaryEnumerator properties to retrieve the resource name and value. Этот способ рекомендуется использовать, если все ресурсы имеют тот же тип, или вы знаете тип данных каждого ресурса.We recommend this technique when all the resources are of the same type, or you know the data type of each resource.

  • Имя каждого ресурса можно получить при прохождении System.Collections.IDictionaryEnumerator коллекции и вызвать GetResourceData метод для извлечения данных ресурса.You can retrieve the name of each resource when you iterate the System.Collections.IDictionaryEnumerator collection and call the GetResourceData method to retrieve the resource's data. Мы рекомендуем этот подход, если вы не знаете тип данных каждого ресурса, или если предыдущий подход будет вызвано исключение.We recommend this approach when you do not know the data type of each resource or if the previous approach throws exceptions.

Извлечение ресурсов с помощью свойства IDictionaryEnumeratorRetrieving Resources by Using IDictionaryEnumerator Properties

Первый метод перечисления ресурсы в RESOURCES-файл включает в себя напрямую извлечение пары имя значение для каждого ресурса.The first method of enumerating the resources in a .resources file involves directly retrieving each resource's name/value pair. После вызова метода IDictionaryEnumerator.MoveNext имя метода для перемещения для каждого ресурса в коллекции, можно извлечь ресурс из IDictionaryEnumerator.Key свойства и данные ресурсов из IDictionaryEnumerator.Value свойство.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.

В следующем примере показано, как получить имя и значение каждого ресурса в RESOURCES-файл с помощью IDictionaryEnumerator.Key и IDictionaryEnumerator.Value свойства.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. Для выполнения этого примера, создайте текстовый файл с именем ApplicationResources.txt для определения строковые ресурсы.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:"  

Затем можно преобразовать текстовый файл ресурсов в двоичный файл с именем ApplicationResources.resources, используя следующую команду: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

В следующем примере затем используется ResourceReader класс перечислить каждый ресурс в двоичный RESOURCES-файл автономных и для отображения имени ключа и соответствующее значение.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)

Попытка получить данные ресурсов из IDictionaryEnumerator.Value свойство можно вызывать следующие исключения:The attempt to retrieve resource data from the IDictionaryEnumerator.Value property can throw the following exceptions:

  • Объект FormatException Если данные не в требуемом формате.A FormatException if the data is not in the expected format.

  • Объект FileNotFoundException Если не удается найти сборку, содержащую тип, к которой принадлежит данные.A FileNotFoundException if the assembly that contains the type to which the data belongs cannot be found.

  • Объект TypeLoadException Если тип, к которой принадлежит данных не может быть не найден.A TypeLoadException if the type to which the data belongs cannot be cannot be found.

Как правило возникают эти исключения, если RESOURCES-файл был изменен вручную, если сборки, в которой определен тип, либо не были включены с приложением или был случайно удален, или в том случае, если сборка является более старой версии, который предшествовал тип.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. Если возникает одно из этих исключений, можно получить ресурсы, перечисление каждого ресурса и вызвав GetResourceData метод, как показано в следующем разделе.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. Такой подход предоставляет некоторую информацию о данных ввода, IDictionaryEnumerator.Value попыталась вернуть свойство.This approach provides you with some information about the data type that the IDictionaryEnumerator.Value property attempted to return.

Извлечение ресурсов по имени с GetResourceDataRetrieving Resources by Name with GetResourceData

Второй подход к перечисление ресурсов в RESOURCES-файл также включает в себя перемещение ресурсов в файле, вызвав IDictionaryEnumerator.MoveNext метод.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. Для каждого ресурса, извлечении имени ресурса из IDictionaryEnumerator.Key свойство, которое затем передается GetResourceData(String, String, Byte[]) метод для извлечения данных ресурса.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. Это значение возвращается в виде массива байтов в resourceData аргумент.This is returned as a byte array in the resourceData argument.

Этот подход является менее удобны, чем получение ресурса имя и значение из IDictionaryEnumerator.Key и IDictionaryEnumerator.Value свойства, поскольку он возвращает фактическое количество байтов, которые образуют значение ресурса.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. Тем не менее, если попытка получить ресурс вызывает исключение, GetResourceData метод может помочь определить источник исключения, указав сведения о типе данных ресурса.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. Дополнительные сведения о строку, указывающую на тип данных ресурса, см. в разделе GetResourceData.For more information about the string that indicates the resource's data type, see GetResourceData.

Как использовать этот подход для извлечения ресурсов, так и для обработки исключений, которые вызываются в следующем примере.The following example illustrates how to use this approach to retrieve resources and to handle any exceptions that are thrown. Он программным образом создает двоичный RESOURCES-файл, который содержит четыре строки, второе логическое значение, одним целым числом, одного точечного рисунка и один произвольный DateTimeTZI объекта.It programmatically creates a binary .resources file that contains four strings, one Boolean, one integer, one bitmap, and one custom DateTimeTZI object. Чтобы запустить пример, сделайте следующее:To run the example, do the following:

  1. Создать сборку с именем Library.dll, содержащий DateTimeTZI структуры.Create an assembly named Library.dll that contains the DateTimeTZI structure. Ниже приведен исходный код для сборки.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
    

    Скомпилируйте исходный код на языке C# с помощью следующей команды:Compile the source code in C# by using the following command:

    csc /t:library library.cs  
    

    Или можно выполнить компиляцию в Visual Basic с помощью следующей команды:Or, you can compile it in Visual Basic by using the following command:

    vbc library.vb /t:library  
    
  2. Скомпилируйте и выполните следующий исходный код, который создает в RESOURCES-файл с именем ContactResources.resources.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
    

    Файл исходного кода называется CreateResources.cs.The source code file is named CreateResources.cs. Его можно скомпилировать в C# с помощью следующей команды:You can compile it in C# by using the following command:

    csc CreateResources.cs /r:library.dll  
    

    Или можно выполнить компиляцию в Visual Basic с помощью следующей команды:Or, you can compile it in Visual Basic by using the following command:

    vbc CreateResources.vb /r:library.dll  
    
  3. Скомпилируйте и запустите следующий код, чтобы перечислить ресурсы в файле 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
    

    После внесения изменений в исходный код (например, выдав намеренно FormatException в конце try блок) или переименование Library.dll сборки, чтобы он недоступен во время выполнения, можно запустить пример, чтобы просмотреть как вызовы GetResourceData позволяют извлечь или повторно создать некоторые сведения о ресурсах.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.

Конструкторы

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

Инициализирует новый экземпляр класса ResourceReader для заданного потока.Initializes a new instance of the ResourceReader class for the specified stream.

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

Инициализирует новый экземпляр класса ResourceReader для указанного именованного файла ресурсов.Initializes a new instance of the ResourceReader class for the specified named resource file.

Методы

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

Освобождает все ресурсы операционной системы, связанные с этим объектом ResourceReader.Releases all operating system resources associated with this ResourceReader object.

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

Освобождает все ресурсы, используемые текущим экземпляром класса ResourceReader.Releases all resources used by the current instance of the ResourceReader class.

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

Определяет, равен ли заданный объект текущему объекту.Determines whether the specified object is equal to the current object.

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

Возвращает перечислитель для данного объекта ResourceReader.Returns an enumerator for this ResourceReader object.

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

Служит хэш-функцией по умолчанию.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[])

Получает имя типа и данные именованного ресурса из открытого файла ресурсов или потока.Retrieves the type name and data of a named resource from an open resource file or stream.

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

Возвращает объект Type для текущего экземпляра.Gets the Type of the current instance.

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

Создает неполную копию текущего объекта Object.Creates a shallow copy of the current Object.

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

Возвращает строку, представляющую текущий объект.Returns a string that represents the current object.

(Inherited from Object)

Явные реализации интерфейса

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

Освобождает ресурсы, используемые объектом ResourceReader.Releases the resources used by the ResourceReader.

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

Возвращает перечислитель для данного объекта ResourceReader.Returns an enumerator for this ResourceReader object.

Методы расширения

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

Приводит элементы объекта IEnumerable к заданному типу.Casts the elements of an IEnumerable to the specified type.

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

Выполняет фильтрацию элементов объекта IEnumerable по заданному типу.Filters the elements of an IEnumerable based on a specified type.

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

Позволяет осуществлять параллельный запрос.Enables parallelization of a query.

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

Преобразовывает коллекцию IEnumerable в объект IQueryable.Converts an IEnumerable to an IQueryable.

Применяется к