Aracılığıyla paylaş


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.

ResourceReader sınıfı, IResourceReader arabiriminin standart bir uygulamasını sağlar. ResourceReader örneği, 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 eklenmiş bir .resources dosyasından almak için kullanılan ResourceManager sınıfından farklıdır. ResourceManager sınıfı, adları önceden bilinen kaynakları almak için kullanılırken, ResourceReader 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 adlandırılabilir (Section1, Section1Item1, Section1Item2vb.) ve ResourceReader nesnesi kullanılarak alınabilir.

Önemli

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

ResourceReader nesnesinin örneğini oluştur

.resources dosyası, Resgen.exe (Kaynak Dosya Oluşturucu)tarafından bir metin dosyasından veya XML .resx dosyasından derlenmiş bir ikili dosyadır. ResourceReader nesnesi 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 nesnesi örneği oluşturmak için, giriş akışı veya .resources dosya adını içeren bir dize ile ResourceReader sınıf oluşturucuyu kullanın. Aşağıdaki örnekte her iki yaklaşım da gösterilmektedir. İlki, dosya adını kullanarak ResourceReader adlı bir .resources dosyasını temsil eden bir Resources1.resources nesnesi oluşturur. İkincisi, dosyadan oluşturulan bir akışı kullanarak ResourceReader adlı bir .resources dosyasını temsil eden bir Resources2.resources nesnesi 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 .resources dosyasını temsil eden bir ResourceReader nesnesi oluşturmak için, .resources dosyasının eklendiği derlemeden bir Assembly nesnesi oluşturun. Assembly.GetManifestResourceStream yöntemi, Stream oluşturucuya geçirilebilen bir ResourceReader(Stream) nesnesi döndürür. Aşağıdaki örnek, eklenmiş bir .resources dosyasını temsil eden bir ResourceReader nesnesinin ö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 GetEnumerator nesnesi döndüren System.Collections.IDictionaryEnumerator yöntemini çağırırsınız. Bir kaynaktan diğerine geçmek için IDictionaryEnumerator.MoveNext yöntemini çağırırsınız. yöntemi, .resources dosyasındaki tüm kaynaklar numaralandırıldığında false döndürür.

Uyarı

ResourceReader sınıfı IEnumerable arabirimini ve IEnumerable.GetEnumerator yöntemini uygulasa da, ResourceReader.GetEnumerator yöntemi IEnumerable.GetEnumerator uygulamasını sağlamaz. Bunun yerine, ResourceReader.GetEnumerator yöntemi 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 her kaynağa gitmek için IDictionaryEnumerator.MoveNext yöntemini çağırdıktan sonra, IDictionaryEnumerator.Key özelliğinden kaynak adını ve IDictionaryEnumerator.Value özelliğinden kaynak verilerini alabilirsiniz.

Aşağıdaki örnekte, IDictionaryEnumerator.Key ve IDictionaryEnumerator.Value özelliklerini kullanarak bir .resources dosyasındaki her kaynağın adını ve değerinin nasıl alındığı gösterilmektedir. Ö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 buna karşılık gelen değeri görüntülemek için ResourceReader sınıfını kullanır.

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($"   {dict.Key}: '{dict.Value}' (Type {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)

IDictionaryEnumerator.Value özelliğinden 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 GetResourceData yöntemini çağırarak kaynakları alabilirsiniz. Bu yaklaşım, IDictionaryEnumerator.Value özelliğinin döndürmeye çalıştığınız veri türü hakkında bazı bilgiler sağlar.

GetResourceData ile kaynakları ada göre alma

.resources dosyasındaki kaynakları numaralandırmaya yönelik ikinci yaklaşım, IDictionaryEnumerator.MoveNext yöntemini çağırarak dosyadaki kaynaklarda gezinmeyi de içerir. Her kaynak için, kaynağın adını IDictionaryEnumerator.Key özelliğinden alırsınız ve daha sonra kaynağın verilerini almak için GetResourceData(String, String, Byte[]) yöntemine geçirilir. Bu, resourceData argümanında bir 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 IDictionaryEnumerator.Value özelliklerinden kaynak adını ve 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. Programlı olarak dört dize, bir Boole, bir tamsayı ve bir bit eşlem 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: {dict.Key}");
                try
                {
                    Console.WriteLine($"   Value: {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: {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: {binData}");
                    break;
                case "ResourceTypeCode.Int32":
                    Console.WriteLine($"   Recreated Value: {BitConverter.ToInt32(data, 0)}");
                    break;
                case "ResourceTypeCode.Boolean":
                    Console.WriteLine($"   Recreated Value: {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: {value1}");
                    break;
                default:
                    break;
            }
            Console.WriteLine();
        }
    }
    

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