ExternalObjectパッケージ

 

 

外部ライブラリとの連携のためのパッケージです。

Microsoft .NET Compact Framework(以下.NET)と連携し、.NET外部オブジェクトの生成、および実行のためのクラスが用意されています。

 

クラス

 

名前

説明

ExternalObject

(.NET連携用)

.NETオブジェクトを保持します

ExtVal

(.NET連携用)

.NETデータ型を一致させるためのクラスです

 

 

.Net連携連携機構について

 

このパッケージを用いることにより.NETで作成されたDLLクラスライブラリや、.NETビルトインクラスの機能を利用することが可能になります。

利用には.NET Compact Framework 2.0以上が必要です。

 

CRSと.NET間のデータ型変換

 

CRSから.NETオブジェクトへ値を渡す場合、また逆に.NETオブジェクトから結果を受け取る場合、それぞれの言語のデータ型に自動的に変換が行われます。

変換ルールは以下のようになります。

 

CRSから.NETへの値変換ルール

CRS型

.NET型(名前空間は省略)

Stringまたは文字列リテラル

String

Number(小数点以下を含まない場合)

整数リテラル(true=1 、false=0を含む)

Int32

Number(小数点以下を含む場合)

小数点付き数値リテラル

Double

Date

DateTime

null

null

ExternalObject

ExternalObject が所有している.NETオブジェクト

 

.NETからCRSへの値変換ルール

.NET型(名前空間は省略)

CRS型

Int32、 UInt32、Boolean 、Int16、 UInt16

Byte、 SByte、Char 、IntPtr、 UIntPtr

整数型

Int64、 UInt64

String

String

DateTime

Date

Byte[]

String

Double、 Single

Number

null

null

Enum値

整数型

その他の型

ExternalObject にてラップ

 

.NETオブジェクト型とExtValクラス

 

前述の通りCRSがサポートしているデータ型は.NETのそれよりも種類が少ないため、.NETのプロパティやメソッドを呼び出す際に、CRSのデータ型では表現できない場合があります。(Booleanなど)

その場合は、ExtValクラスを用いて.NETに渡したい値をラップすることで対応できます。

 

例)true(=整数1)をBoolean>型として設定

var ret = extobj.SetProperty("SampleProp", new ExtVal(true, ExtVal.Boolean));

 

ユーザークラスライブラリDLL 作成時の注意点

 

ユーザーがクラスライブラリDLLを作成する際、Biz/Browserからインスタンスを作成できるクラスはPublicクラス、呼び出し可能なメソッドはPublicメソッドとして定義してください。

作成したDLLは、Biz/Browserインストールフォルダに"dll.net"という名前のフォルダを作成し、その下に配置してください。

例)

(Biz/Browserインストールフォルダ)\dll.net\sample.dll

 

ライブラリの指定方法

 

.NETオブジェクトの生成時や、スタティックメソッドの呼び出しでは、.NETクラスが定義されているライブラリを指定します。

 

ユーザークラスライブラリDLLに定義されたクラスを指定する場合は、DLLファイル名のみ記述します。(ファイルパスは不要です)

指定されたDLLファイルは、Biz/Browserインストールフォルダにある"dll.net"フォルダから検索されます。

※Biz/Browser Mobile 4.0.0以降では、DLLへの絶対パスが指定できるようになりました。dll.netフォルダ以外に配置されたDLLも指定できます。

 

例)

var extobj = new ExternalObject("SampleNS.SampleClass", "sample.dll")

 

mscorlibアセンブリにある基本クラスは、ライブラリは不要なのでnullを指定します。

例)

var ret = ExternalObject.InvokeStatic("System.Math", null, "Pow", 2, 10);
print(ret, "\n");

 

その他のグローバル・アセンブリ・キャッシュに登録されているライブラリを使用する場合は、厳密な名前でアセンブリを指定します。

例)

var lib = "System.Windows.Forms, Version=2.0.0.0, Culture=Neutral, PublicKeyToken=b77a5c561934e089";
ExternalObject.InvokeStatic("System.Windows.Forms.MessageBox", lib, "Show", "abc");

 

引数の指定方法

 

.NETクラスのコンストラクタやメソッドの引数に指定できるものには、CRSの一般的な型やリテラル、ExternalObjectオブジェクト、ExtValオブジェクトがあります。

引数はCRSと.NET間の型変換のルールに従い.NET型に変換されて渡されます。

 

例)

数値リテラルをそのまま指定する

var extobj = new ExternalObject("System.Random", null, 999);
var ret = extobj.Invoke("Next", 0, 100);
print(ret, "\n");

 

文字列型の変数を指定する

var str = "TMP";
var ret = ExternalObject.InvokeStatic("System.Environment", null, "GetEnvironmentVariable", str);
print(ret, "\n");

 

ExtValクラスを使って.NET型を指定する

var v = new ExtVal(true, ExtVal.Boolean);
var ret = ExternalObject.InvokeStatic("System.Convert", null, "ToString", v);
print(ret, "\n");

 

ExtValクラスを使って.NET列挙体を指定する

var lib = "System.Windows.Forms, Version=2.0.0.0, Culture=Neutral, PublicKeyToken=b77a5c561934e089";
var buttons = new ExtVal("System.Windows.Forms.MessageBoxButtons.OK", ExtVal.Enume, lib);
var icon = new ExtVal("System.Windows.Forms.MessageBoxIcon.Asterisk", ExtVal.Enume, lib);
ExternalObject.InvokeStatic("System.Windows.Forms.MessageBox", lib, "Show", "ABC", "123", buttons, icon); 

 

値に変換できないその他のCRSオブジェクトや参照を指定した場合はエラーになります。

 

コンストラクタ、メソッドの呼び出しでは、呼び出し先で定義されているすべての引数の型と完全に一致している必要があります。(参照型、値型の違いも含む)

クラス名、メソッド名、すべての引数の型が一致しない場合は、呼び出し先を見つけることができずにエラーとなります。

 

参照型の引数を指定する場合は、ExtValクラスのデータ型の指定にExtVal.ByRefを組み合わせます。

例)

var v1 = new ExtVal("abc", ExtVal.String + ExtVal.ByRef);
var v2 = new ExtVal("xyz", ExtVal.String + ExtVal.ByRef);
ExternalObject.InvokeStatic("SampleNS.SampleClass", "sample.dll", "Swap", v1, v2);
print(strf("v1=%1 v2=%2", v1, v2), "\n");

 

ユーザー例外の発生

 

ExternalObject.Invokeメソッド、またはExternalObject.InvokeStaticメソッドでは、.NETクラス側で発生したユーザー例外を捕捉することができます。

対象となるメソッド内でSystem.ApplicationExceptionクラスまたはその派生クラスを例外としてスローすると、Biz/Browserでは通常のエラー時の例外とは区別した例外(EXTOBJ-6)が発生します。

CRSの例外オブジェクトには子オブジェクトExtExceptionが付加されます。ExtExceptionは.NET側でスローした例外を保持するExternalObjectオブジェクトです。

この機構によりCRSから.NETの例外クラスにアクセスして情報を取得することができます。

 

例)ユーザー例外を捕捉

try {
    var extobj = ExternalObject.InvokeStatic("SampleNS.SampleClass", "sample.dll");
    extobj.Invoke("SampleMethod");
} catch (e) {
    if (e.Method == "EXTOBJ" && e.Code == 6) {
        MessageBox(e.ExtException.GetProperty("Message"));
    }
}

 

ExternalObject(.NET連携)のアーキテクチャ

 

ネイティブアプリケーションであるBiz/BrowserまたはBiz/Browser Mobile(以下Biz/Browser)から直接.NETライブラリを呼び出すことは通常できません。そのため.NETで作成されたサブプログラム(invoker.exe)を介して.NETのオブジェクトを操作しています。

 

invoker.exeはExternalObjectクラスにより.NETオブジェクトの操作が行われる初回に自動的に起動し、Biz/Browser終了時に自動的に終了します。ユーザーはinvoker.exeの存在を意識する必要はありません。

 

 

invoker.exeはBiz/Browserの監視下に置かれており、invoker.exeに何らかの問題が起こり実行が中断された場合、CRSの例外としてエラー報告されます。

 

ExternalObjectクラスは.NETオブジェクトに一対一で対応し.NETインスタンスの生成と消滅、プロパティやメソッドへのアクセスを提供するラッパーおよびリダイレクタとしての機能を有しています。ExternalObjectクラスは内部で自動的にinvoker.exeと連携し、あたかもBiz/Browserから直接.NETオブジェクトを操作しているよう振る舞います。

 

invoker実行ログ出力

 

invoker.exeはデバッグ機能としてログ出力機能を持っています。

invoker.exeと同じフォルダに"logging.on"という名前のファイルを配置するとinvoker.exeはinvokerlog.txtという実行ログファイルを出力します。logging.onファイルはファイルさえあれば0バイトでも構いません。

 

 

 

 

 



「オンラインマニュアル」一覧へ戻る
「Bizの宝箱」TOPへ戻る