Практическое руководство. Восстановление часовых поясов из внедренного ресурса
В этом разделе описывается восстановление часовых поясов, сохраненных в файле ресурсов. Сведения и инструкции по сохранению часовых поясов см. в разделе "Практическое руководство. Сохранение часовых поясов в внедренном ресурсе".
Десериализация объекта TimeZoneInfo из внедренного ресурса
Если извлекаемый часовой пояс не является пользовательским часовом поясом, попробуйте создать его экземпляр с помощью FindSystemTimeZoneById метода.
Создайте ResourceManager экземпляр объекта, передав полное имя внедренного файла ресурсов и ссылку на сборку, содержащую файл ресурса.
Если вы не можете определить полное имя внедренного файла ресурсов, используйте Ildasm.exe (IL Disassembler) для изучения манифеста сборки.
.mresource
Запись определяет ресурс. В этом примере полное имя ресурса —SerializeTimeZoneData.SerializedTimeZones
это .Если файл ресурса внедрен в ту же сборку, содержащую код экземпляра часового пояса, можно получить ссылку на нее, вызвав
static
метод (Shared
в Visual Basic). GetExecutingAssemblyЕсли вызов FindSystemTimeZoneById метода завершается сбоем или создается экземпляр пользовательского часового пояса, получите строку, содержащую сериализованный часовой пояс, вызвав ResourceManager.GetString метод.
Десериализация данных часового пояса FromSerializedString путем вызова метода.
Пример
В следующем примере десериализируется TimeZoneInfo объект, хранящийся в внедренном XML-файле ресурсов .NET.
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
Этот код иллюстрирует обработку исключений, чтобы обеспечить TimeZoneInfo наличие объекта, требуемого приложением. Сначала он пытается создать экземпляр TimeZoneInfo объекта, извлекая его из реестра с помощью FindSystemTimeZoneById метода. Если экземпляр часового пояса не удается создать, код извлекает его из внедренного файла ресурсов.
Так как данные для пользовательских часовых поясов (экземпляр часовых поясов с помощью CreateCustomTimeZone метода) не хранятся в реестре, код не вызывает FindSystemTimeZoneById создание экземпляра часового пояса для Палмера, Антарктида. Вместо этого он сразу же будет выглядеть в внедренном файле ресурсов, чтобы получить строку, содержащую данные часового пояса перед вызовом FromSerializedString метода.
Компиляция кода
Для этого примера требуются:
Эта ссылка на System.Windows.Forms.dll и System.Core.dll будет добавлена в проект.
Импортируются следующие пространства имен:
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