Home Notices Documents Classes Download Others Rice
Documents  >  開発  >  動的組み込みクラスの実装  >  クラスの動的な登録
クラスの動的な登録の実装

このページの目的

このページは概要のページで述べたように、RtemplateEmbedder.csの実装について詳説します。



RtemplateEmbedder.csがアプリケーションへの動的なクラスの組み込みを担当します。


最初のセクションで組み込みクラスがどのようにアプリケーションに登録されるかについて説明します。

次に組み込みのためのインターフェースクラスであるIEmbedPrototypeクラスについての説明します。

次にIEmbedPrototypeの唯一のメソッドであるEmbed()メソッドについての説明をします。

最後に実装の例を示すためにセクションを設けます。

組み込みクラス登録の仕組み

組み込みクラスのアプリケーションへの登録とは、RiceManagerクラスのAddBuiltIn()メソッドの呼び出しです。Riceは実行環境へのクラスの組み込み手段をこのメソッドしか持ちません。

AddBuiltIn()メソッドは引数として、クラス名と引数なしでRtypeを返すデリゲートを取ります。例えば、templateクラスのRiceへの登録は以下のようになります。


RiceManager.AddBuiltIn(Rtemplate.TYPENAME, Rtemplate.InstanceGenerator);


CookerGXの作成時に組み込まれるクラスについては問題がありません。それらのソースファイルはCookerGXのプロジェクトに含まれるので、クラス名もデリゲートも既知であり、AddBuiltIn()メソッドを適切な引数で呼び出せるからです。

問題はCookerGXの起動時に動的に組み込まれるクラスです。これらは未知のクラスでありクラス名もデリゲートも不明な状態です。何らかの手段を講じないとこれらのクラスに対してAddBuiltIn()メソッドを呼び出すことはできません。

幸いなことに、CookerGXは未知のクラスに対して正しくAddBuiltIn()メソッドを呼び出すための機構を持っています。


CookerGXの動的な組み込みクラス登録には三つのポイントがあります。


1 : 組み込みクラスの.dllファイルの置かれるディレクトリ

CookerGXの場合、組み込みクラスの.dllファイルは実行ディレクトリ(CookerGX.exeのあるディレクトリ)のdllsサブディレクトリ以下のどこかに置かれなければいけません。

dllsディレクトリ直下でもいいですし、そのサブディレクトリ内でもいいです。サブディレクトリのサブディレクトリの...でも構いません。

dllsディレクトリをルートにしたディレクトリ階層のどこかに置かれなければいけません。

2 : 組み込みクラスの.dllファイルの名前

概要のページで説明していますここを参照してください

3 : IEmbedPrototypeインターフェース

以下で説明します。

IEmbedPrototype

IEmbedPrototypeクラスは動的なクラス組み込みために用意されたインターフェースクラスです。

IEmbedPrototypeクラスの定義を以下に示します。

1:public interface IEmbedPrototype {
1:void Embed(string path);
1:}

Riceは動的なクラス組み込みの要求に対して、上記 1 のディレクトリ階層にある 2 に該当する.dllファイルの中にIEmbedPrototype派生クラスが無いかを確認します。

IEmbedPrototype派生クラスがあれば、その唯一のメンバーであるEmbed()メソッドを呼び出します。

public void Embed(string path)

上記の手順で、.dllファイル内のEmbed()メソッドが呼ばれます。このEmbed()メソッドは.dllファイルのプロジェクトに含まれているのですから、組み込むべきクラスのクラス名とデリゲートを知っています。

つまり、ここでAddBuiltIn()メソッドを呼び出してクラスを登録することができます。


Embed()メソッドが呼び出されたとき、path引数にはEmbed()メソッドが含まれる.dllファイルの絶対パスが渡されます。

実装の一案

ここではtemplateクラスのためのEmbed()メソッドの実装例を示してみます。

Embed()メソッドのpath引数には.dllファイルの絶対パスが渡されることに注意してください。

1:public class RtemplateEmbedder : IEmbedPrototype {
2:public void Embed(string path) {
3:// class registration
4:RiceManager.AddBuiltIn(Rtemplate.TYPENAME, Rtemplate.InstanceGenerator);
5:// Sets message text.
6:FileInfo dllFile = new FileInfo(path);
7:string messageFilePath = dllFile.Directory.FullName + @"\message.template.txt";
8:FileInfo messageFile = new FileInfo(messageFilePath);
9:if (messageFile.Exists) {
10:RiceManager.SetFromFile(messageFilePath);
11:}
12:else {
13:RiceManager.AddMessage("Rtemplate-mess001", "It is a message #1.");
14:RiceManager.AddMessage("Rtemplate-mess002", "It is a message #2.");
15:}
16:}
17:}

上記の実装例はAddBuiltIn()メソッドの呼び出しとそれ以降の部分に分けられます。

AddBuiltIn()メソッドの呼び出しについては、既出であるので説明を割愛します。

AddBuiltIn()メソッド以降の部分は、path引数の使用例を示すためのものです。


今、templateクラスに必要な例外メッセージがmessage.template.txtに保存されていて、そのファイルはRtype.template.dllと同じディレクトリにあるものとします。

path引数には.dllファイルの絶対パスが渡されるので、このパス情報から同じディレクトリに存在するファイルへのパスを作成するのは容易です。

パスが作成できれば、ファイルの存在確認、メッセージの読み出しができます。ファイルがあればメッセージを読み込み、無ければデフォルトのメッセージを登録します。

例えば、ファイルに英語以外のメッセージを保存しておけば簡単な多言語化が実現できます。

おわりに

サンプルファイルのクラス名やクラスメンバーの実装を、これまでの説明に沿って適切に変更すれば、新しい組み込みクラスの.dllファイルがビルドできるはずです。


このドキュメントではtemplateクラスを想定して説明をしてきました。templateクラスは説明のためのクラスですので実用に耐えるような機能を持ちません。しかし、CookerGXには既に幾つもの組み込みクラスが存在し、その実装は全て公開されています。実際に利用されているクラスの実装は、あなたの組み込みクラス実装の助けになるはずです。それらのアーカイブファイルは組み込みクラスのマニュアルページにあります。組み込みクラス実装の参考として是非とも利用してください。

Previous
Copyright © CookerGX All rights reserved.