この記事の英語版を表示するには、[英語] のチェック ボックスをオンにしてください。また、テキストにマウス ポインターを合わせると、ポップアップ ウィンドウに英語のテキストを表示することもできます。
翻訳
英語

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

 

このトピックでは、リソース ファイルに保存されているタイム ゾーンを復元する方法について説明します。 タイム ゾーンの保存に関する詳細と方法については、「方法 : 埋め込みリソースにタイム ゾーンを保存する」を参照してください。

埋め込みリソースから 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;
   }
}

このコードは、アプリケーションで必要な TimeZoneInfo オブジェクトが存在することを確認するための例外処理を示しています。 最初に、FindSystemTimeZoneById メソッドを使用してレジストリから取得する方法で、TimeZoneInfo オブジェクトのインスタンス化を試みます。 タイム ゾーンをインスタンス化できない場合は、埋め込みリソース ファイルから取得します。

カスタム タイム ゾーン (CreateCustomTimeZone メソッドを使用してインスタンス化されるタイム ゾーン) のデータはレジストリに格納されていないので、Palmer, Antarctica のタイム ゾーンをインスタンス化するときは 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;
    
表示: