API version 1
- ‐
ExternalObject¶
.NETオブジェクトを保持するクラスです。
.NETオブジェクトに一対一で対応し、.NETインスタンスの生成と消滅、.NETのプロパティやメソッドへのアクセス機能を提供します。
セキュリティ設定によりこのクラスのインスタンス化を抑止することができます。
セキュリティ設定は設定ファイル(crsconf)の security.external_execution プロパティで指定します。
注釈
[Biz/Browser DT 概要マニュアル]-[設定ファイル(crsconf)について]
デフォルトプロパティ
デフォルトプロパティはありません。
.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[] |
ByteArray |
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の例外としてエラー報告されます。
invoker実行ログ出力¶
invoker.exeはデバッグ機能としてログ出力機能を持っています。
invoker.exeと同じフォルダに "logging.on" という名前のファイルを配置するとinvoker.exeはinvokerlog.txtという実行ログファイルを出力します。logging.onファイルはファイルさえあれば0バイトでも構いません。