外部ライブラリとの連携のためのパッケージです。
Windowsタブレット版ではMicrosoft .NET Framework(以下.NET) と連携し、.NET外部オブジェクトの生成、および実行のためのクラスが用意されています。
PKG |
名前 |
説明 |
---|---|---|
1 |
(.Net連携用) |
.Netオブジェクトを保持します |
1 |
(.Net連携用) |
.Netデータ型を一致させるためのクラスです |
ExternalObjectパッケージの利用はセキュリティレベルによって制限されています。ExternalObjectパッケージはセキュリティレベルを0に設定することで利用できます。
セキュリティレベル1以上では、ExternalObjectパッケージのクラスをインスタンス化しようとしたときに例外が発生します。
このパッケージを用いることにより.NETで作成されたDLLクラスライブラリや、.NETビルトインクラスの機能を利用することが可能になります。
利用には.NET Framework 2.0以上が必要です。
変換ルールは以下のようになります。
.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にてラップ |
前述の通りCRSがサポートしているデータ型は.NETのそれよりも種類が少ないため、.NETのプロパティやメソッドを呼び出す際に、CRSのデータ型では表現できない場合があります。(Booleanなど)
その場合は、ExtValクラスを用いて.NETに渡したい値をラップすることで対応できます。
例)true(=整数1)をBoolean型として設定
var ret = extobj.SetProperty("SampleProp", new ExtVal(true, ExtVal.Boolean));
ユーザーがクラスライブラリ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"フォルダから検索されます。
例)
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")); } }
ネイティブアプリケーションであるBiz/Browser SmartDevice(以下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.exeはデバッグ機能としてログ出力機能を持っています。
invoker.exeと同じフォルダに"logging.on"という名前のファイルを配置するとinvoker.exeはinvokerlog.txtという実行ログファイルを出力します。logging.onファイルはファイルさえあれば0バイトでも構いません。