API version 1
- ‐

ExternalObject

.NETオブジェクトを保持するクラスです。

.NETオブジェクトに一対一で対応し、.NETインスタンスの生成と消滅、.NETのプロパティやメソッドへのアクセス機能を提供します。

CRSプログラムによる.NETオブジェクトの作成のほか、.NETメソッドの呼び出しの結果として返される.NETオブジェクトにも使用されます。
ExternalObjectクラスのメソッドの呼び出しで、ExternalObjectオブジェクトを引数として使用することも可能です。

デフォルトプロパティ

デフォルトプロパティはありません。

.NET連携機構について

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" フォルダから検索されます。
ファイル名を絶対パスで記述すると、 "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では通常のエラー時の例外とは区別した例外「CRS::Option::Windows-1:6」が発生します。

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

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

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

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

invoker.exeはBiz/Browserのタブ毎にExternalObjectクラスにより.NETオブジェクトの操作が行われる初回に自動的に起動し、タブのクローズ時に自動的に終了します。ユーザーは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バイトでも構いません。