加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

在LINUX下面也可以运行.NET

(2012-08-29 17:01:00)
标签:

杂谈

分类: aspx
我不怎么玩Linux,只是把自己遇到的写出来。
既然大家那么喜欢分,这次我就多放100分出来。。本来我只习惯放88分的。。
凡是纯接分纯表情无意义复制粘贴的。。嘿嘿。。反正我不怎么接贴的。。
---------------------------
© Conmajia 2012

“Write once, run anywhere”(一次编写,到处运行,WORA),有时也写成“Write once, run everywhere”(WORE),是Sun Microsystem(于2010年被Oracle收购)为宣传Java语言的跨平台特性而提出的口号。在理想情况下——当然常常是不可能的——将Java语言写成的程序编译为标准的字节码(bytecode),就可以运行在支持Java虚拟机(JVM)的任何设备上。

很多半吊子的Java“专家”常常用这点来挤兑.NET的使用者,说他们“被微软绑架了,只有JVM这种业界标准才能跨平台”。

真实的情况是什么呢?一方面,真正的Java开发者不断抱怨着“Write once, debug anywhere"(一次编写,到处调试),另一方面,越来越多的人认识到.NET的本质实际是CLS,也是业界标准,CLR也是虚拟机。所以,总是在“跨平台”的能力上突出Java而贬低.NET,已经是落伍和压根不懂的表现了。

最近我因为电脑运行速度慢,于是删除了Windows,转而安装Linux Mint(一个基于Ubuntu的Linux发行版)。

在Linux环境下,有很出名的.NET运行时——Mono。
尽管对于已经广泛使用的技术(如.NET)而言,运行时的文件大小已经没有太大的讨论意义,但是从有人拿这个说事。那么Mono的表现又如何呢?
Mono的完全安装大小为78MB(Java最小安装尺寸95MB),而Mono最小化安装之需要7MB。(参考文献:http://www.infoq.com/cn/news/2007/07/Mono-Runtime-Size)
Mono的大名,搞.NET的朋友相信都知道。它使.NET程序在Linux(还有Mac OS版本)下有了跨平台运行的可能。Mono目前支持到.NET v3.5,已经逐渐趋于稳定和流行了。由于我只会C#(惭愧),因此需要在Linux下开发和运行.NET程序,于是安装Mono运行时。
Assembly code
$ sudo apt-get install mono-gmcs libmono-system-data2.0-cil libmono-system-ldap2.0-cil libmono-system-messaging2.0-cil libmono-system-runtime2.0-cil


为了能够方便开发,我直接安装了MonoDevelop。这是Windows上大名鼎鼎的开源.NET IDE SharpDevelop的Linux版本。

安装命令如下:
Assembly code
$ sudo apt-get install monodevelop


下面是几个简单的程序测试。注意,这里的程序代码在Windows下是完全可以运行的。

命令行程序
C# code
using System;

namespace Test
{
class Program
{
static void Main()
{
Console.WriteLine("Hello Mono!");
Console.ReadLine();
}
}
}


运行结果

WinForm程序
C# code
using System;
using System.Windows.Forms;

namespace test
{
public class MainForm:Form
{
TextBox textBox1;
Button button1;
public MainForm ()
{
textBox1=new TextBox();
textBox1.Text="Text here...";
textBox1.Location=new System.Drawing.Point(10,10);
button1=new Button();
button1.Text="Click me.";
button1.AutoSize=true;
button1.Location=new System.Drawing.Point(10,40);
this.Controls.Add (textBox1);
this.Controls.Add (button1);
}
}
}


运行结果

是不是很意外,某些Java“砖家”?Linux下面可以直接运行WinForm的程序。就是这么方便。演示代码是在Linux下编译的,还不能证明“Write once, run anywhere”,那么,就直接运行Windows下编译出来的exe又如何?

下面是我之前在Windows下用Visual Studio和SharpDevelop编译的exe不做任何处理(也没法处理)直接运行。

首先是《蜂巢大战》,先来看看Windows下运行的效果。

然后是在Linux下运行。

注意:因为默认.exe是和归档管理器关联的,所以需要选择打开方式为“Mono Runtime”。
运行效果如下

经测试各种功能正常。说明GDI+工作正常,ToolStrip等控件也运行正常。

再来看看我最近发表的另一个程序:《InvokeHelper》。

Windows下是这样的

在Mono环境下运行是这个效果

说明和线程相关的功能工作正常。

再来是和Windows API相关的。其实用脚指头想也是不可能的(不光C#,随便什么语言都一样,这种和平台API强相关的,怎么可能“跨平台”呢)。

《获取系统图标》,这个程序使用了SHGetFileInfo这个Windows API:
C# code
[DllImport("Shell32.dll")]
static extern int SHGetFileInfo(
string pszPath,
uint dwFileAttributes,
ref SHFILEINFO psfi,
uint cbFileInfo,
uint uFlags
);


在Windows中工作正常

在Linux下如何呢?运行下试试:

调用打开文件对话框正常,但是一旦运行到Windows API就自动退出。所以,跨了平台后,和平台(Win)相关的API不能用了,这也是理所当然的。C#和Java都没办法跳掉这样的命运(笑)。

总结

目前比较有名的非Windows平台下.NET虚拟机/运行时暂时只有Mono一家,相信随着时间推移,会有更多的Runtime出现,Mono也会变得更强大。到时,不止是Java,C#还有.NET平台下的各种语言(VB、C++/CLI、F#等)都可以实现“Write once, run anywhere”了。当然,还有随之而来的“Debug anywhere”(笑)。

(完)

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有