Freigeben über


Gewusst wie: Wiederherstellen von Zeitzonen aus einer eingebetteten Ressource

Aktualisiert: November 2007

In diesem Thema wird beschrieben, wie in einer Ressourcendatei gespeicherte Zeitzonen wiederhergestellt werden. Informationen und Anweisungen zum Speichern von Zeitzonen finden Sie unter Gewusst wie: Speichern von Zeitzonen in einer eingebetteten Ressource.

So deserialisieren Sie ein TimeZoneInfo-Objekt aus einer eingebetteten Ressource

  1. Wenn es sich bei der abzurufenden Zeitzone nicht um eine benutzerdefinierte Zeitzone handelt, versuchen Sie, diese mit der FindSystemTimeZoneById-Methode zu instanziieren.

  2. Instanziieren Sie ein ResourceManager-Objekt, indem Sie den vollqualifizierten Namen der eingebetteten Ressourcendatei und einen Verweis auf die Assembly, in der die Ressourcendatei enthalten ist, übergeben.

    Wenn Sie den vollqualifizierten Namen der eingebetteten Ressourcendatei nicht ermitteln können, verwenden Sie den MSIL Disassembler-Tool (Ildasm.exe) zum Untersuchen des Assemblymanifests. Die Ressource wird durch einen .mresource-Eintrag identifiziert. Im Beispiel lautet der vollqualifizierte Name der Ressource SerializeTimeZoneData.SerializedTimeZones.

    Wenn die Ressourcendatei in die gleiche Assembly eingebettet ist, die auch den Code zum Instanziieren der Zeitzone beinhaltet, können Sie einen Verweis darauf abrufen, indem Sie die static (Shared in Visual Basic) GetExecutingAssembly-Methode aufrufen.

  3. Wenn der Aufruf der FindSystemTimeZoneById-Methode nicht erfolgreich ist oder wenn eine benutzerdefinierte Zeitzone instanziiert werden soll, rufen Sie eine Zeichenfolge mit der serialisierten Zeitzone ab, indem Sie die ResourceManager.GetString-Methode aufrufen.

  4. Deserialisieren Sie die Zeitzonendaten, indem Sie die FromSerializedString-Methode aufrufen.

Beispiel

Im folgenden Beispiel wird ein in einer eingebetteten .NET-XML-Ressourcendatei gespeichertes TimeZoneInfo-Objekt deserialisiert.

Private Sub DeserializeTimeZones()
   Dim cst, palmer As TimeZoneInfo
   Dim timeZoneString As String
   Dim resMgr As ResourceManager = New ResourceManager("SerializeTimeZoneData.SerializedTimeZones", Assembly.GetExecutingAssembly)

   ' Attempt to retrieve time zone from system
   Try
      cst = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time")
   Catch ex As TimeZoneNotFoundException
      ' Time zone not in system; retrieve from resource
      timeZoneString = resMgr.GetString("CentralStandardTime")
      If Not String.IsNullOrEmpty(timeZoneString) Then
         cst = TimeZoneInfo.FromSerializedString(timeZoneString)
      Else
         MsgBox("Unable to create Central Standard Time Zone. Application must exit.")
         Exit Sub
      End If
   End Try
   ' Retrieve custom time zone
   Try
      timeZoneString = resMgr.GetString("PalmerStandardTime")
      palmer = TimeZoneInfo.FromSerializedString(timeZoneString)
   Catch ex As Exception
      MsgBox(ex.GetType().Name & ": Unable to create Palmer Standard Time Zone. Application must exit.")
      Exit Sub
   End Try
End Sub
private void DeserializeTimeZones()
{
   TimeZoneInfo cst, palmer;
   string timeZoneString;
   ResourceManager resMgr = new ResourceManager("SerializeTimeZoneData.SerializedTimeZones", Assembly.GetExecutingAssembly());

   // Attempt to retrieve time zone from system
   try
   {
      cst = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
   }
   catch (TimeZoneNotFoundException)
   {
      // Time zone not in system; retrieve from resource
      timeZoneString = resMgr.GetString("CentralStandardTime");
      if (! String.IsNullOrEmpty(timeZoneString))
      {
         cst = TimeZoneInfo.FromSerializedString(timeZoneString);
      }
      else
      {
         MessageBox.Show("Unable to create Central Standard Time Zone. Application must exit.", "Application Error");
         return;
      }
   }
   // Retrieve custom time zone
   try
   {
      timeZoneString = resMgr.GetString("PalmerStandardTime");
      palmer = TimeZoneInfo.FromSerializedString(timeZoneString);
   }
   catch (MissingManifestResourceException) 
   {
      MessageBox.Show("Unable to retrieve the Palmer Standard Time Zone from the resource file. Application must exit.");
      return;
   }
}

Dieser Code veranschaulicht die Ausnahmebehandlung, mit der sichergestellt wird, dass ein für die Anwendung erforderliches TimeZoneInfo-Objekt vorhanden ist. Es wird zunächst versucht, ein TimeZoneInfo-Objekt durch Abrufen aus der Registrierung mithilfe der FindSystemTimeZoneById-Methode zu instanziieren. Wenn die Zeitzone nicht instanziiert werden kann, ruft der Code sie aus der eingebetteten Ressourcendatei ab.

Da Daten benutzerdefinierter Zeitzonen (mit der CreateCustomTimeZone-Methode instanziierte Zeitzonen) nicht in der Registrierung gespeichert werden, ruft der Code nicht FindSystemTimeZoneById auf, um die Zeitzone für Palmer, Antarktis zu instanziieren. Stattdessen wird versucht, eine Zeichenfolge mit den Zeitzonendaten direkt aus der eingebetteten Ressourcendatei abzurufen, bevor die FromSerializedString-Methode aufgerufen wird.

Kompilieren des Codes

Für dieses Beispiel ist Folgendes erforderlich:

  • Ein Verweis auf System.Windows.Forms.dll und System.Core.dll muss dem Projekt hinzugefügt werden.

  • Die folgenden Namespaces müssen importiert werden:

    Imports System.Globalization
    Imports System.IO
    Imports System.Reflection
    Imports System.Resources
    
    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Globalization;
    using System.IO;
    using System.Reflection;
    using System.Resources;
    using System.Windows.Forms;
    

Siehe auch

Aufgaben

Gewusst wie: Speichern von Zeitzonen in einer eingebetteten Ressource

Konzepte

Übersicht über Zeitzonen

Weitere Ressourcen

Uhrzeiten und Zeitzonen