Partager via


Procédure : restaurer des fuseaux horaires à partir d’une ressource incorporée

Cette rubrique explique comment restaurer des fuseaux horaires qui ont été enregistrés dans un fichier de ressources. Pour obtenir des informations et des instructions sur l’enregistrement des fuseaux horaires, consultez Guide pratique pour enregistrer des fuseaux horaires dans une ressource incorporée.

Pour désérialiser un objet TimeZoneInfo à partir d’une ressource incorporée

  1. Si le fuseau horaire à récupérer n’est pas un fuseau horaire personnalisé, essayez de l’instancier avec la méthode FindSystemTimeZoneById.

  2. Instanciez un objet ResourceManager en passant le nom complet du fichier de ressources incorporé ainsi qu’une référence à l’assembly contenant le fichier de ressources.

    Si vous ne pouvez pas déterminer le nom complet du fichier de ressources incorporé, utilisez Ildasm.exe (désassembleur IL) pour examiner le manifeste de l’assembly. Une entrée .mresource identifie la ressource. Dans l’exemple, le nom complet de la ressource est SerializeTimeZoneData.SerializedTimeZones.

    Si le fichier de ressources est incorporé dans le même assembly que celui qui contient le code d’instanciation de fuseau horaire, vous pouvez récupérer une référence à celui-ci en appelant la méthode staticGetExecutingAssembly (Shared en Visual Basic).

  3. Si l’appel de la méthode FindSystemTimeZoneById échoue ou si un fuseau horaire personnalisé doit être instancié, récupérez une chaîne qui contient le fuseau horaire sérialisé en appelant la méthode ResourceManager.GetString.

  4. Désérialisez les données de fuseau horaire en appelant la méthode FromSerializedString.

Exemple

L’exemple suivant désérialise un objet TimeZoneInfo stocké dans un fichier de ressources .NET XML incorporé.

private void DeserializeTimeZones()
{
   TimeZoneInfo cst, palmer;
   string timeZoneString;
   ResourceManager resMgr = new ResourceManager("SerializeTimeZoneData.SerializedTimeZones", this.GetType().Assembly);

   // 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;
   }
}
Private Sub DeserializeTimeZones()
    Dim cst, palmer As TimeZoneInfo
    Dim timeZoneString As String
    Dim resMgr As ResourceManager = New ResourceManager("SerializeTimeZoneData.SerializedTimeZones",
                                    GetType(SerializeTimeZoneData).Assembly)

    ' 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

Ce code illustre la gestion des exceptions pour garantir qu’un objet TimeZoneInfo requis par l’application est présent. Il tente d’abord d’instancier un objet TimeZoneInfo en le récupérant du Registre avec la méthode FindSystemTimeZoneById. Si le fuseau horaire ne peut pas être instancié, le code le récupère du fichier de ressources incorporé.

Du fait que les données des fuseaux horaires personnalisés (fuseaux horaires instanciés avec la méthode CreateCustomTimeZone) ne sont pas stockées dans le Registre, le code n’appelle pas FindSystemTimeZoneById pour instancier le fuseau horaire Station Palmer, Antarctique. Au lieu de cela, il recherche immédiatement le fichier de ressources incorporé pour y récupérer une chaîne qui contient les données du fuseau horaire avant d’appeler la méthode FromSerializedString.

Compilation du code

Cet exemple nécessite :

  • L’ajout d’une référence à System.Windows.Forms.dll et à System.Core.dll dans le projet.

  • L’importation des espaces de noms suivants :

    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;
    
    Imports System.Globalization
    Imports System.IO
    Imports System.Reflection
    Imports System.Resources
    

Voir aussi