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#呼び出しでした(反対は楽なんですけどね)