C# をインタプリタっぽく使ってみる
ばいばい Ruby、きみとはもうさよならだ!
中身は こないだ のつづき。
といっても、前のエントリでだいたい書いたし、
むしろ AppDomain 使ってないぶん楽になってるんだよな。。 require と addref をサポートしてみた。
代わりに
「ファイル監視+自動リビルド」やったから結局 AppDomain 使うことになった。
使い方はこんなかんじ。
csi.exe \ /define:DEBUG \ /warn:4 \ /require:..\..\test\include \ /lib:..\..\test\lib \ ..\..\test\script.cs arg1 arg2 arg3
require
ソースコード中にこんな↓指定をみつけたときに
///require: hoge.cs
以下のディレクトリからこれを検索して、一緒にビルドする。
- script.cs と同じディレクトリ
- コンパイラオプション /require で指定されたディレクトリ
addref
ソースコード中にこんな↓指定をみつけたときに
///addref: testlib.dll
以下のディレクトリからこれを検索して、実行時に参照する。
- script.cs と同じディレクトリ
- コンパイラオプション /lib で指定されたディレクトリ
実際には script.cs をビルドしてエントリポイント関数を実行する直前に、
必要な dll を script.cs のアセンブリと同じ場所にファイルコピーしてる。
そのために、こないだは CompilerParameters.GenerateInMemory を true にしてたけど、
今回はファイルシステム上にアセンブリが必要だったから false にしてる。
その他
あと、こないだやらなかったことといえば、
コマンドライン引数を属性クラス使って処理してみた。
思ったよりシンプルにできていいかんじだったかも。