方法: 埋め込みリソースからタイム ゾーンを復元する
このトピックでは、リソース ファイルに保存されているタイム ゾーンを復元する方法について説明します。 タイム ゾーンの保存に関する情報および手順については、「方法: 埋め込みリソースにタイム ゾーンを保存する」をご覧ください。
埋め込みリソースから TimeZoneInfo オブジェクトを逆シリアル化する方法
取得するタイム ゾーンがカスタム タイム ゾーンでない場合は、FindSystemTimeZoneById メソッドを使用してインスタンス化してみてください。
埋め込みリソース ファイルの完全修飾名と、リソース ファイルを含むアセンブリへの参照を渡すことによって、ResourceManager オブジェクトをインスタンス化します。
埋め込みリソース ファイルの完全修飾名を特定できない場合は、Ildasm.exe (IL 逆アセンブラー) を使用してアセンブリのマニフェストを確認します。 リソースを識別する
.mresource
エントリ。 この例では、リソースの完全修飾名はSerializeTimeZoneData.SerializedTimeZones
です。リソース ファイルが、タイム ゾーンのインスタンス化コードを含むのと同じアセンブリに埋め込まれている場合は、
static
(Visual Basic の場合はShared
) GetExecutingAssembly メソッドを呼び出すことによって、それへの参照を取得できます。FindSystemTimeZoneById メソッドへの呼び出しが失敗する場合、またはカスタム タイム ゾーンをインスタンス化する場合は、ResourceManager.GetString メソッドを呼び出して、シリアル化されたタイム ゾーンを含む文字列を取得します。
FromSerializedString メソッドを呼び出してタイム ゾーン データを逆シリアル化します。
例
次の例では、埋め込み .NET XML リソース ファイルに格納されている TimeZoneInfo オブジェクトを逆シリアル化します。
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 オブジェクトが存在することを確認するための例外処理を示します。 まず、FindSystemTimeZoneById メソッドを使用してレジストリから TimeZoneInfo オブジェクトを取得することによって、それのインスタンス化を試行します。 タイム ゾーンをインスタンス化できない場合、コードによって、埋め込みリソース ファイルからそれが取得されます。
カスタム タイム ゾーン (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
関連項目
.NET