Scala で .NET 用の実行ファイル作成
Scala の追加パッケージ scala-msil を使えば、Scala のスクリプトから .NET 用の MSIL(Microsoft Intermediate Language)テキストファイルを生成できる。ということで早速試してみる。
今回使った環境は以下の通り。
- Scala 2.7.3
scala-msil インストール
まずは、sbaz を使って scala-msil をインストールする。sbaz (Scala Bazaars) は Scala のパッケージ管理ツールで、Maven とか RubyGems みたいなもの。
Scala の実行環境が整っていれば、以下のコマンドを実行する事で scala-msil がインストールされる。
>sbaz install scala-msil
なお、プロキシサーバー経由でインターネットに接続している場合は、Scala のホームディレクトリに config/sbaz.properties ファイルを作成して以下の内容を記述しておく。
- http.proxySet=true
- http.proxyHost=プロキシサーバーのホスト名 or IPアドレス
- http.proxyPort=プロキシサーバーのポート番号
config/sbaz.properties ファイルの例
http.proxySet=true http.proxyHost=192.168.1.1 http.proxyPort=8080
ソースコード作成
準備が整ったら、Scala スクリプトを作成していく。
ここで、実行クラス(scala.Application クラスのサブクラスの意)の名称とファイル名を一致させる必要があるみたいなので、大文字/小文字の違いに注意。
SampleTest.scala ファイル
class SampleNode(val name: String) { def printName() = println(name) } //実行クラス object SampleTest extends Application { override def main(args: Array[String]) { new SampleNode("abc").printName() } }
今回は上記のような非常に単純なサンプルを用意した。
.NET アセンブリ作成
作成した Scala スクリプトを scala-msil で追加された scalac-net コマンドの引数に与えると MSIL テキストファイル(SampleTest.msil)が生成される。
>scalac-net SampleTest.scala
次に、生成された MSIL ファイルと .NET Framework SDK や Mono に付属している ilasm.exe を使って実行ファイルを作成する。
>ilasm SampleTest.msil
ここで、scala-msilで追加された以下の DLL ファイルを SampleTest.exe が生成されたディレクトリにコピーする。(他に DLL を GAC に配置する方法もある)
実は、.NET 用の Scala 関連クラス定義(scala.Application 等)が以下の DLL ファイルに含まれており、SampleTest.exe 実行時にロードできるようにしておく必要がある。
- lib/predef.dll
- lib/scalaruntime.dll
動作確認
以下のように SampleTest.exe を実行すれば abc という文字列が出力され、正常に動作している事が確認できる。
通常の .NET Framework を使う場合
>SampleTest abc
Mono を使う場合
>mono SampleTest.exe abc
追加の動作確認
せっかく、.NET アセンブリを作成したのだから、Scala で定義したクラスを .NET 言語から呼び出してみようって事で IronPython を使って SampleNode クラスを使ってみる事に。
使った環境は以下の通り。
- IronPython 2.0
test.py
import clr clr.AddReference("SampleTest.exe") import SampleNode SampleNode("test-node1").printName()
実行結果は以下の通りで、問題無く SampleNode クラスの printName メソッドを呼び出せる。
>ipy test.py test-node1