Comment : restaurer des fuseaux horaires dans une ressource incorporée
Mise à jour : novembre 2007
Cette rubrique décrit 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 de fuseaux horaires, consultez Comment : enregistrer des fuseaux horaires dans une ressource incorporée.
Pour désérialiser un objet TimeZoneInfo à partir d'une ressource incorporée
Si le fuseau horaire à récupérer n'est pas un fuseau horaire personnalisé, essayez de l'instancier en utilisant la méthode FindSystemTimeZoneById.
Instanciez un objet ResourceManager en passant le nom qualifié complet du fichier de ressources incorporées et une référence à l'assembly qui contient le fichier de ressources.
Si vous ne pouvez pas déterminer le nom qualifié complet du fichier de ressources incorporées, utilisez le MSIL Disassembler (Ildasm.exe) pour examiner le manifeste de l'assembly. Une entrée .mresource identifie la ressource. Dans l'exemple, le nom qualifié complet de la ressource est SerializeTimeZoneData.SerializedTimeZones.
Si le fichier de ressources est incorporé dans le même assembly qui contient le code d'instanciation du fuseau horaire, vous pouvez récupérer une référence en appelant la méthode static (Shared dans Visual Basic) GetExecutingAssembly.
Si l'appel à 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.
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 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;
}
}
Ce code illustre la gestion des exceptions pour garantir la présence d'un objet TimeZoneInfo requis par l'application. Il essaie d'abord d'instancier un objet TimeZoneInfo en le récupérant dans le Registre à l'aide de la méthode FindSystemTimeZoneById. Si le fuseau horaire ne peut pas être instancié, le code le récupère à partir du fichier de ressources incorporées.
Comme les données des fuseaux horaires personnalisés (fuseaux horaires instanciés à l'aide de la méthode CreateCustomTimeZone) ne sont pas stockées dans le Registre, le code n'appelle pas FindSystemTimeZoneById pour instancier le fuseau horaire de Palmer, en Antarctique. À la place, il consulte immédiatement le fichier de ressources incorporées pour 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 :
qu'une référence à System.Windows.Forms.dll et System.Core.dll soit ajoutée au projet.
que les espaces de noms suivants soient importés :
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;
Voir aussi
Tâches
Comment : enregistrer des fuseaux horaires dans une ressource incorporée
Concepts
Vue d'ensemble des fuseaux horaires