graphics.hatenablog.com

技術系テクニカルアーティストのあれこれ

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 にしてる。

その他

あと、こないだやらなかったことといえば、
コマンドライン引数を属性クラス使って処理してみた。
思ったよりシンプルにできていいかんじだったかも。