方法: 埋め込みリソースからタイム ゾーンを復元する

このトピックでは、リソース ファイルに保存されているタイム ゾーンを復元する方法について説明します。 タイム ゾーンの保存に関する情報および手順については、「方法: 埋め込みリソースにタイム ゾーンを保存する」をご覧ください。

埋め込みリソースから TimeZoneInfo オブジェクトを逆シリアル化する方法

  1. 取得するタイム ゾーンがカスタム タイム ゾーンでない場合は、FindSystemTimeZoneById メソッドを使用してインスタンス化してみてください。

  2. 埋め込みリソース ファイルの完全修飾名と、リソース ファイルを含むアセンブリへの参照を渡すことによって、ResourceManager オブジェクトをインスタンス化します。

    埋め込みリソース ファイルの完全修飾名を特定できない場合は、Ildasm.exe (IL 逆アセンブラー) を使用してアセンブリのマニフェストを確認します。 リソースを識別する .mresource エントリ。 この例では、リソースの完全修飾名は SerializeTimeZoneData.SerializedTimeZones です。

    リソース ファイルが、タイム ゾーンのインスタンス化コードを含むのと同じアセンブリに埋め込まれている場合は、static (Visual Basic の場合は Shared) GetExecutingAssembly メソッドを呼び出すことによって、それへの参照を取得できます。

  3. FindSystemTimeZoneById メソッドへの呼び出しが失敗する場合、またはカスタム タイム ゾーンをインスタンス化する場合は、ResourceManager.GetString メソッドを呼び出して、シリアル化されたタイム ゾーンを含む文字列を取得します。

  4. 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
    

関連項目