银河

SKYIV STUDIO

  博客园 :: 首页 :: 博问 :: 闪存 :: :: :: 订阅 订阅 :: 管理 ::

话说我在单位的安装 Ubuntu 9.10 操作系统 Lenovo ThinkCentre M4000t 台式机上写完“也谈在 .NET 平台上使用 Scala 语言(上)”之后不久,就下班回家了。于是,我就在家里的安装 Windows Vista 操作系统的 Dell Inspiron 1520 本本上继续工作。首先就是启动 Sun Virtualbox 打开一个 Ubuntu 9.10 操作系统。而这个 Ubuntu 9.10 操作系统中尚未安装 Scala SDK 软件包。正好,我在上一篇文章中谈到:

当然,在 Ubuntu 操作系统中也可以不使用 apt-get 命令,而是自己去 Scala 官方网站下载最新 Scala 2.7.7 的 Linux 安装包,自己安装,这样就会集中安装在一起了,而且也可以有 sbaz 工具了。当然,这时候就要你自己负责 Scala 软件包的升级更新了,Ubuntu 操作系统可不会帮你升级更新不使用 apt-get命令安装的软件包的。

那么,我们就来实践一下吧:

ben@ben-vbox:~/src$ wget http://www.scala-lang.org/downloads/distrib/files/scala-2.7.7.final.tgz
ben@ben-vbox:~/src$ tar xzf scala-2.7.7.final.tgz
ben@ben-vbox:~/src$ sudo mv scala-2.7.7.final /opt

这就算安装好了 Scala SDK 。为了方便起见,我们在 ~/.bashrc 文件的最后加入以下内容:

# set PATH for Scala
SCALA_HOME=/opt/scala-2.7.7.final
if [ -d "$SCALA_HOME/bin" ] ; then
    PATH="$PATH:$SCALA_HOME/bin"
fi

我们来检查一下安装效果:

ben@ben-vbox:~$ scalac -version
Scala compiler version 2.7.7.final -- Copyright 2002-2009, LAMP/EPFL
ben@ben-vbox:~$ scala -version
Scala code runner version 2.7.7.final -- Copyright 2002-2009, LAMP/EPFL
ben@ben-vbox:~$ scala
Welcome to Scala version 2.7.7.final (OpenJDK 64-Bit Server VM, Java 1.6.0_0).
Type in expressions to have them evaluated.
Type :help for more information.
scala> :quit
ben@ben-vbox:~$ sbaz -version
sbaz 1.25tmp -- (c) 2005-2009 LAMP/EPFL
ben@ben-vbox:~$ sbaz installed
base/1.9
sbaz/1.25tmp
sbaz-setup/1.0
scala/2.7.7.final
scala-devel/2.7.7.final
scala-library/2.7.7.final
scala-tool-support/2.7.7.final
7 packages installed
ben@ben-vbox:~$

很好,正确安装了 2.7.7 版本,并且 sbaz 工具也有了。那么,还等什么?赶紧安装 scala-msil 吧:

ben@ben-vbox:~$ sbaz install scala-msil
planning to install: scala-msil/2.7.7.final
Installing...
ben@ben-vbox:~$ sbaz installed
base/1.9
sbaz/1.25tmp
sbaz-setup/1.0
scala/2.7.7.final
scala-devel/2.7.7.final
scala-library/2.7.7.final
scala-msil/2.7.7.final
scala-tool-support/2.7.7.final
8 packages installed
ben@ben-vbox:~$

 

工具都齐全了,我们就可以开始干活了。首先,把上篇文章中的 dotnet.scala 稍做修改,如下所示:

import System.Console

object dotnet extends Application {
  Console.WriteLine("       Scala.NET: 欢迎光临");
  Console.WriteLine("      OS Version: " + Environment.OSVersion);
  Console.WriteLine("     CLR Version: {0}  ( {1} )", Environment.Version, Skyiv.RuntimeFramework.CurrentFramework);
  Console.WriteLine("Default Encoding: " + System.Text.Encoding.Default);
}

改动之处在于增加显示 RuntimeFramework 类的 CurrentFramework 属性,这个 RuntimeFramework 类在源程序代码在“.NET Framework CLR 版本检测”这篇文章中可以找到,这里就不重复给出了。

 

最后,就是 makefile 文件了:

 

所有的源代码都准备齐全了,总算可以用 make 命令来生成我们的目标了:

ben@ben-vbox:~/Projects/ScalaNet$ make
csc -t:library -out:RuntimeFramework.dll RuntimeFramework.cs
/opt/scala-2.7.7.final/bin/scalac-net -Xassem-path RuntimeFramework.dll dotnet.scala
cp /opt/scala-2.7.7.final/lib/predef.dll .
ilasm dotnet.msil
Assembling 'dotnet.msil' , no listing file, to exe --> 'dotnet.exe'
Operation completed successfully
ben@ben-vbox:~/Projects/ScalaNet$

make 命令首先调用 csc (就是 gmcs 的别名) 来编译 RuntimeFramework.cs 以生成 RuntimeFramework.dll。

然后,再调用 scalac-net 以便从 dotnet.scala 生成 dotnet.msil 。注意,由于 dotnet.scala 调用了 RuntimeFramework.dll 中的类,所以需要加上 -Xassem-path RuntimeFramework.dll 参数,不然就会出错。

接着,再使用 cp 命令将 predef.dll 文件从 Scala 的库目录拷贝到当前目录。

最后,调用 ilasm 将 dotnet.msil 汇编为 dotnet.exe。

 

最终,程序的运行结果如下:

ben@ben-vbox:~/Projects/ScalaNet$ ls -l *
-rw-r--r-- 1 ben ben    3072 2009-12-22 23:19 dotnet.exe
-rw-r--r-- 1 ben ben    5852 2009-12-22 23:19 dotnet.msil
-rw-r--r-- 1 ben ben     375 2009-12-22 22:07 dotnet.scala
-rw-r--r-- 1 ben ben     440 2009-12-22 22:07 makefile
-rw-r--r-- 1 ben ben 1180160 2009-12-22 23:19 predef.dll
-rw-r--r-- 1 ben ben    4102 2009-12-22 22:07 RuntimeFramework.cs
-rwxr-xr-x 1 ben ben    6144 2009-12-22 23:18 RuntimeFramework.dll
ben@ben-vbox:~/Projects/ScalaNet$ mono dotnet.exe
       Scala.NET: 欢迎光临
      OS Version: Unix 2.6.31.16
     CLR Version: 2.0.50727.1433  ( Mono 2.4.2.3 )
Default Encoding: System.Text.UTF8Encoding
ben@ben-vbox:~/Projects/ScalaNet$

可以看到,dotnet.scala 程序调用了一个定义在 RuntimeFramework.cs 程序中的 RuntimeFramework 类的 CurrentFramework 属性来显示出 mono 的版本: Mono 2.4.2.3 。也就是,我们成功地实现了 Scala 语言 C# 语言混合编程。

 

完整的源程序可以到 http://bitbucket.org/ben.skyiv/scalanet/downloads/ 页面下载。

也可以使用 hg clone http://bitbucket.org/ben.skyiv/scalanet/ 命令下载。

关于 hg ,请参阅 Mercurial 备忘录

 

好了,今天就到这里为此吧。至于上篇文章中说的众多的 mscorlib.dll 的不同版本问题,留到下次再谈吧。

posted on 2009-12-22 23:56  银河  阅读(2013)  评论(6编辑  收藏  举报