System.Resources.ResourceReader sınıfı

Bu makale, bu API'nin başvuru belgelerine ek açıklamalar sağlar.

Önemli

Güvenilmeyen verilerle bu sınıftan yöntemleri çağırmak bir güvenlik riskidir. Bu sınıftaki yöntemleri yalnızca güvenilen verilerle çağırın. Daha fazla bilgi için bkz . Tüm Girişleri Doğrulama.

sınıfı, ResourceReader arabiriminin IResourceReader standart bir uygulamasını sağlar. Örnek ResourceReader , tek başına bir .resources dosyasını veya bir derlemeye eklenmiş bir .resources dosyasını temsil eder. Bir .resources dosyasındaki kaynakları listelemek ve adını/değer çiftlerini almak için kullanılır. Belirtilen adlandırılmış kaynakları bir derlemeye ResourceManager eklenmiş bir .resources dosyasından almak için kullanılan sınıfından farklıdır. ResourceManager sınıfı, adları önceden bilinen kaynakları almak için kullanılırkenResourceReader, sınıfı derleme zamanında sayısı veya kesin adları bilinmeyen kaynakları almak için kullanışlıdır. Örneğin, bir uygulama, bir bölümdeki bölüm veya öğe sayısının önceden bilinmediği bölümler ve öğeler halinde düzenlenmiş yapılandırma bilgilerini depolamak için bir kaynak dosyası kullanabilir. Daha sonra kaynaklar genel olarak (, Section1Section1Item1, , Section1Item2vb.) adlandırılabilir ve bir ResourceReader nesne kullanılarak alınabilir.

Önemli

Bu tür arabirimini IDisposable uygular. Türünü kullanmayı bitirdiğinizde, doğrudan veya dolaylı olarak atmalısınız. Türü doğrudan atmak için yöntemini bir try/catch blok içinde çağırın.Dispose Bunu dolaylı olarak atmak için (C#'de) veya Using (Visual Basic'te) gibi using bir dil yapısı kullanın. Daha fazla bilgi için arabirim belgelerindeki "IDisposable Uygulayan Bir Nesne Kullanma" bölümüne IDisposable bakın.

ResourceReader nesnesi örneği oluşturma

.resources dosyası, Resgen.exe (Kaynak Dosya Oluşturucu) tarafından bir metin dosyasından veya XML .resx dosyasından derlenmiş bir ikili dosyadır. Nesne ResourceReader , tek başına bir .resources dosyasını veya bir derlemeye eklenmiş bir .resources dosyasını temsil edebilir.

Tek başına bir .resources dosyasından okuyan bir ResourceReader nesnenin örneğini oluşturmak için, bir giriş akışı veya .resources dosya adını içeren bir dize ile sınıf oluşturucuyu kullanın ResourceReader . Aşağıdaki örnekte her iki yaklaşım da gösterilmektedir. İlki, dosya adını kullanarak adlı Resources1.resources bir .resources dosyasını temsil eden bir nesnenin örneğini ResourceReader oluşturur. İkincisi, dosyadan oluşturulan bir ResourceReader akışı kullanarak adlı Resources2.resources bir .resources dosyasını temsil eden bir nesnenin örneğini oluşturur.

// 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)

Katıştırılmış bir ResourceReader .resources dosyasını temsil eden bir nesne oluşturmak için, .resources dosyasının eklendiği derlemeden bir Assembly nesne örneği oluşturun. yöntemiAssembly.GetManifestResourceStream, oluşturucuya ResourceReader(Stream) geçirilebilen bir Stream nesne döndürür. Aşağıdaki örnek, eklenmiş bir ResourceReader .resources dosyasını temsil eden bir nesnenin örneğini oluşturur.

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)

ResourceReader nesnesinin kaynaklarını listeleme

Bir .resources dosyasındaki kaynakları numaralandırmak için yöntemini çağırırsınız GetEnumerator ve bu da bir System.Collections.IDictionaryEnumerator nesne döndürür. Bir kaynaktan diğerine geçmek için yöntemini çağırırsınız IDictionaryEnumerator.MoveNext . yöntemi, .resources dosyasındaki tüm kaynaklar numaralandırıldığında döndürür false .

Not

sınıfı arabirimini ve yöntemini uygulasa daResourceReader, ResourceReader.GetEnumerator yöntemi uygulamayı sağlamazIEnumerable.GetEnumerator.IEnumerable.GetEnumeratorIEnumerable Bunun yerine yöntemi, ResourceReader.GetEnumerator her kaynağın adı/değer çiftine erişim sağlayan bir IDictionaryEnumerator arabirim nesnesi döndürür.

Koleksiyondaki tek tek kaynakları iki şekilde alabilirsiniz:

IDictionaryEnumerator özelliklerini kullanarak kaynakları alma

Bir .resources dosyasındaki kaynakları listelemenin ilk yöntemi, her kaynağın adını/değer çiftini doğrudan almayı içerir. Koleksiyondaki IDictionaryEnumerator.MoveNext her kaynağa gitmek için yöntemini çağırdıktan sonra, özellikten IDictionaryEnumerator.Key kaynak adını ve özelliğinden IDictionaryEnumerator.Value kaynak verilerini alabilirsiniz.

Aşağıdaki örnekte, ve IDictionaryEnumerator.Value özelliklerini kullanarak bir .resources dosyasındaki her kaynağın adını ve değerinin nasıl alındığı gösterilmektedirIDictionaryEnumerator.Key. Örneği çalıştırmak için dize kaynaklarını tanımlamak üzere ApplicationResources.txt adlı aşağıdaki metin dosyasını oluşturun.

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:"

Ardından aşağıdaki komutu kullanarak metin kaynak dosyasını ApplicationResources.resources adlı bir ikili dosyaya dönüştürebilirsiniz:

resgen ApplicationResources.txt

Aşağıdaki örnek, tek başına ikili .resources dosyasındaki her kaynağı listelemek ve anahtar adını ve karşılık gelen değeri görüntülemek için sınıfını kullanır ResourceReader .

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

public class Example1
{
   public static void Run()
   {
      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 Example2
    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)

özelliğinden IDictionaryEnumerator.Value kaynak verilerini alma girişimi aşağıdaki özel durumları oluşturabilir:

Genellikle, .resources dosyası el ile değiştirilmişse, türün tanımlandığı derleme bir uygulamaya dahil edilmediyse veya yanlışlıkla silinmişse ya da derleme bir tür öncesi eski bir sürümse bu özel durumlar oluşturulur. Bu özel durumlardan biri oluşturulursa, aşağıdaki bölümde gösterildiği gibi her kaynağı numaralandırıp yöntemini çağırarak GetResourceData kaynakları alabilirsiniz. Bu yaklaşım, özelliğin döndürmeye çalıştığınız veri türü IDictionaryEnumerator.Value hakkında bazı bilgiler sağlar.

GetResourceData ile kaynakları ada göre alma

.resources dosyasındaki kaynakları listelemeye yönelik ikinci yaklaşım, yöntemini çağırarak dosyadaki kaynaklarda gezinmeyi IDictionaryEnumerator.MoveNext de içerir. Her kaynak için, kaynağın adını özelliğinden IDictionaryEnumerator.Key alırsınız ve ardından kaynağın verilerini almak için yöntemine GetResourceData(String, String, Byte[]) geçirilir. Bu, bağımsız değişkende resourceData bayt dizisi olarak döndürülür.

Bu yaklaşım, kaynak değerini oluşturan gerçek baytları döndürdüğünden IDictionaryEnumerator.Key ve özelliklerinden kaynak adını ve IDictionaryEnumerator.Value değerini almaktan daha gariptir. Ancak, kaynağı alma girişimi bir özel durum oluşturursa, GetResourceData yöntemi kaynağın veri türü hakkında bilgi sağlayarak özel durumun kaynağını belirlemeye yardımcı olabilir. Kaynağın veri türünü gösteren dize hakkında daha fazla bilgi için bkz GetResourceData. .

Aşağıdaki örnekte, kaynakları almak ve oluşan özel durumları işlemek için bu yaklaşımın nasıl kullanılacağı gösterilmektedir. Program aracılığıyla, bir Boole, bir tamsayı ve bir bit eşlem olmak üzere dört dize içeren bir ikili .resources dosyası oluşturur. Örneği çalıştırmak için aşağıdakileri yapın:

  1. ContactResources.resources adlı bir .resources dosyası oluşturan aşağıdaki kaynak kodunu derleyip yürütebilirsiniz.

    using System.Drawing;
    using System.Drawing.Imaging;
    using System.IO;
    using System.Resources;
    using System.Runtime.Versioning;
    
    public class Example5
    {
        [SupportedOSPlatform("windows")]
        public static void Run()
        {
            // 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("ClientVersion", true);
                rw.Generate();
            }
        }
    }
    

    Kaynak kod dosyası CreateResources.cs olarak adlandırılır. Aşağıdaki komutu kullanarak C# dilinde derleyebilirsiniz:

    csc CreateResources.cs /r:library.dll
    
  2. ContactResources.resources dosyasındaki kaynakları listelemek için aşağıdaki kodu derleyin ve çalıştırın.

    using System;
    using System.Collections;
    using System.Drawing;
    using System.IO;
    using System.Resources;
    using System.Runtime.Versioning;
    
    public class Example6
    {
        [SupportedOSPlatform("windows")]
        public static void Run()
        {
            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);
                }
            }
        }
    
        [SupportedOSPlatform("windows")]
        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;
                default:
                    break;
            }
            Console.WriteLine();
        }
    }
    

    Kaynak kodunu değiştirdikten sonra (örneğin, bloğun try sonuna kasıtlı olarak bir FormatException oluşturarak), bazı kaynak bilgilerini almanıza veya yeniden oluşturmanıza olanak tanıyan çağrıları görmek için GetResourceData örneği çalıştırabilirsiniz.