NOBlog 〜バカの一念〜

基本的にはNOB(ノブ)の日記。
スキークロス国際レース出場を目標に日々努力中。

  November/2007  
S M T W T F S
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  
blog内検索

[.NET基本]リソースファイルを利用したメッセージ管理

2005-01-25
.NET環境では、メッセージの管理はどのように行うのが良いのでしょうか。
テキストファイルに定義し、ファイルを走査するAPIを利用して取得しますか?それともDBに格納しておきますか?
.NETでは、リソースファイルという便利なファイルが存在します。
リソースファイルを利用したメッセージ管理法を紹介します。
リソースファイルは、実行不可能なファイルで、アプリケーションと共に配置されます。
リソースには、文字列・イメージ・永続化されたオブジェクト等、多数の形式のデータを格納することができま
す。但し、永続化されたオブジェクトは、シリアル化可能なオブジェクトに限ります。

私たちの普段の開発では、リソースファイルはメッセージの格納領域として利用されている事が多いと思われま
す。今回は、テキストファイルにメッセージ用文字列を定義し、それを.resourcesファイルに変換し、そこから
メッセージを取得する方法を紹介しようと思います。


テキストファイルを作成する

まず、テキストファイルにメッセージを定義します。
メッセージの定義形式は「name = value」という形です。行頭にセミコロンまたはシャープを付
ける事によってコメントを記述する事も可能です。以下に定義の例を示します。

   ;テスト用メッセージ
   Msg_1 = メッセージ出力テスト

valueには改行を含める事はできません。メッセージを途中で改行したい場合は、エスケープ文字を利用
します。改行は\n、タブは\tなどを使用できます。
このテキストファイルを後で.resourceファイルとしてコンパイルするわけですが、リソースファイルジェネレ
ータ(Resgen.exe)は、規定では文字列をUTF-8として扱いますが、保存方法が適切であれば、リトルエンディア
ンバイト順のUTF-16、ビッグエンディアンバイト順のUTF-16も使用できます。


テキストファイルを.resourcesファイルに変換する

テキストファイルをアセンブリに埋め込む事はできないので、.resourcesファイルに変換します。
変換にはリソースファイルジェネレータ(Resgen.exe)を使用します。Resgen.exeはResourceWriterをラップした
ユーティリティなので、ResourceWriterクラスの利用方法を知らなくても、.resourcesファイルを生成する事が
できます。利用方法は以下の通りです。

   resgen myresource.txt MyAppRes.resources

このコマンドでは、myresource.txtを読み込み、MyAppRes.resourcesリソースファイルを作成します。
Resgen.exeは、ResourceReaderもラップするので、この逆(リソースファイルからテキストファイルを作成)も可
能です。

Resgen.exeで.resourcesファイルを作成したら、アセンブリリンカ(Al.exe)を使用して、ランタイムバイナリ実
行可能ファイルに埋め込むか、コンパイルしてサテライトアセンブリに組み込みます。
アセンブリリンカについてはMSDN「アセンブリ リンカ(Al.exe)」、コンパイルによる埋め込みについてはMSDN
リンクと埋め込みオプション」を参照すると良いでしょう。


リソースファイルの情報を利用する

では、アセンブリに埋め込んだリソースのデータを利用してみましょう。
リソースにアクセスするには、ResourceMangerクラスを使用します。ResourceManagerクラスの各インスタンス
は、1つのアセンブリに関連付けられ、そのアセンブリに埋め込まれたリソースの取得を管理します。

リソース内の文字列を取得するには、まずResourceManagerクラスのインスタンスを作成し、次にGetStringメソ
ッドを呼び出します。以下にコードを記述します。

   Dim asm As Assembly = アセンブリを取得(詳細は後で説明します)
   Dim resmng As New System.Resources.ResourceManager("ResourceNamespace.ResourceName", asm)

第一引数には、ネームスペースを含むリソースのルート名を指定します。(拡張子は付加しません)
com.app名前空間にあるResApp.resourcesというファイルの場合は、"com.app.ResApp"となります。
ResApp.en-US.resourcesというファイルの場合にも、"com.app.ResApp"となります。ルート名とは、ロケールを
含まない共通のリソース名を言います。

第二引数にはそのリソースが埋め込まれているアセンブリを指定します。
アセンブリの取得方法はいくつかあります。

アセンブリが、まだロードされていない場合
   Dim asm As System.Reflection.Assembly = System.Reflection.Assembly.Load("TargetAssembly")


ResourceManagerを作成したクラスの存在するアセンブリ内にリソースがある場合
   Dim asm As System.Reflection.Assembly = Me.GetType.Assembly


ResourceManagerを作成したクラスの存在するアセンブリを呼び出したアセンブリ内にリソースがある場合
   Dim asm As System.Reflection.Assembly.GetCallingAssembly


これで、ResourceManagerのインスタンスが作成できたので、GetStringメソッドを呼び出して文字列を取得しま
す。この際に、リソースファイル内で定義したkeyを指定します。

   Dim msg As String = resmng.GetString("Msg_1")

msgには、"メッセージ出力テスト"という文字列が割り当てられます。

実際の開発では、リソースには「{0}処理を開始します。」という文字列をセットしておき、この文字列を取得
した後、String.Formatメソッドを利用して動的に文字列を作成するという方法を利用すると良いでしょう。

   'リソースファイル内の定義:msg_001 = {0}処理を開始します。
   Dim msgbase As String = resmng.GetString("msg_001")
   Dim showmsg As String = String.Format(msgbase, "登録")
   MessageBox.Show(showmsg)
   '出力結果は、「登録処理を開始します。」となります。

今回は、リソースファイルがアセンブリに埋め込まれている場合の取得方法を紹介しましたが、リソースファイ
ルは単独で配置する事も可能です。リソースファイルに関する詳細はMSDN「アプリケーションのリソース」あた
りを参照すると良いでしょう。


※注
当ブログのTipsは、@IT等の情報サイトの内容を参考にして構成された記事
もあります。Tipsの内容に著作権等権利を侵害する内容があった場合には、
告知して下さい。早急に訂正または削除にて対応したいと思います。

この記事へのトラックバックURL

この記事へのコメント
Copyright(C) PwBlog. All rights reserved.