银河

SKYIV STUDIO

  博客园 :: 首页 :: 博问 :: 闪存 :: :: :: 订阅 订阅 :: 管理 ::
  268 随笔 :: 2 文章 :: 2616 评论 :: 140万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

话说我在单位的安装 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# 语言混合编程。

 

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

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

关于 hg ,请参阅 Mercurial 备忘录

 

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

posted on   银河  阅读(2025)  评论(6编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述
历史上的今天:
2006-12-22 在 Linux 下运行 ASP.NET 2.0
点击右上角即可分享
微信分享提示