ExternalObject¶
.NETオブジェクトを保持するクラスです。
.NETオブジェクトに一対一で対応し、.NETインスタンスの生成と消滅、.NETのプロパティやメソッドへのアクセス機能を提供します。
デフォルトプロパティ
デフォルトプロパティはありません。
.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クラスが定義されているライブラリを指定します。
例)
var extobj = new ExternalObject("SampleNS.SampleClass", "sample.dll")
例)
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");
var v = new ExtVal(true, ExtVal.BOOLEAN);
var ret = ExternalObject.invokeStatic("System.Convert", null, "ToString", v);
print(ret, "\n");
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);
参照型の引数を指定する場合は、 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の監視下に置かれており、invoker.exeに何らかの問題が起こり実行が中断された場合、CRSの例外としてエラー報告されます。