Scala で .NET 用の実行ファイル作成

Scala の追加パッケージ scala-msil を使えば、Scala のスクリプトから .NET 用の MSIL(Microsoft Intermediate Language)テキストファイルを生成できる。ということで早速試してみる。

今回使った環境は以下の通り。

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 クラスを使ってみる事に。

使った環境は以下の通り。

test.py
import clr
clr.AddReference("SampleTest.exe")
import SampleNode

SampleNode("test-node1").printName()

実行結果は以下の通りで、問題無く SampleNode クラスの printName メソッドを呼び出せる。

>ipy test.py
test-node1