jscriptとC#のinterop

お題目としては良く出てくる上に何度かやった事もありますが、頻度的には極めて稀だと思うこのJScript-C# interop。
C#が結構良いので、わざわざJScriptでいじりたい、とも思わないんですよね。 IronPython以降は良くinteropするようになりましたが。
さて、今回は珍しくそのinteropのシナリオが本当に起こりました。
まず、TLにcsvサポートを入れようとしました。 CSVのパーサなんて誰かが書いているとは思うのですが、未だに仕事で使う可能性を捨て切れていない為、 自前でスクラッチから書こうと思っています。 でもそんな事はあんまりやりたい仕事でもありません。 しかもJSではちょくちょく使う為手元にコードの書き溜めがあります。
テストデータだけ移植してC#で書き直す線も考えたのですが、 やっぱりかったるい。なんとかならないかなぁ、と思った所、JS版なら手元にある事に思い至りました。

ふむ、それなら、という事でjscでコンパイルしてみました。

% jsc /out:JScriptCsvParser.dll /t:library csv.js
csv.js (1, 1): error JS1234: 型およびパッケージ定義のみがライブラリ内で使用出来ます

うぅ、JSのいい所はグローバルにへこへこ書ける気軽さでもあると思うのですが…
とりあえず元のコードとの二重メンテになるので、なるべく変更無しでコンパイルしたいと思い、 行頭にpackageと行末に閉じ括弧を追加してみました。

csv.js (3, 1): error JS1161: パッケージ内で使用出来るのはクラスのみです。

うが、ようするにクラス化必須なのね。 しょうがないのでメソッド化する事に。

package JScriptCsvParser{
class RowCsvParser {
function Parse(contents) {

<以下本文…>

return csvParse(contents);
}
}
}

staticでも良い気がしてきましたが、もう面倒なのでこのまま行きます。
さて、これでようやくコンパイルが通り、本文の部分は一切変更無しでC#から呼べました。 けれど、引数も戻りも型がオブジェクト型に。 引数はたぶんstringを入れておけば大丈夫だと思うのですが、戻りはなんでしょうか?
せっかくなのでTLで触ってみました。

!ref "(path)\\JscriptCsvParser.dll"
!use JScriptCsvParser
!new RowCsvParser -> parser
parser GetType
Microsoft.JScript.Array

なるほど、そういう物なのですか。 という訳でMicrosoft.JScript.Arrayにキャストする事にしました。
割と面倒が多いJScript-C#呼び出しでした(反対は楽なんですけどね)

カテゴリー: TL パーマリンク

コメントを残す