也谈在 .NET 平台上使用 Scala 语言(中)

说我在单位的安装 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 文件的最后加入以下内容:

1
2
3
4
5
# 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 稍做修改,如下所示:

1
2
3
4
5
6
7
8
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# 语言混合编程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值