.NET支持多平台后的一点拙见

我们目前对.NET的理解大部分可以归纳为:起初它是Java平台(注意是平台,不要跟Java语言搞混淆)的一个克隆品,后来慢慢演变,有了自己的特性。由于Java平台最显著的特点就是“平台独立性”(或者说不知道谁发明的Write once,Run anywhere这个话)。理论上,你可以写一个程序编译完后,跑在任何一个安装有JVM的操作系统上。大部分人认为.NET的出现是效仿Sun公司的这个伟大的概念——平台独立性,从而与Java抗衡。再后来又有一些人不知道从哪得出的结论说,就算有像Mono这样的非Windows平台.NET CLR,也有好多.NET程序不能移植到其他操作系统中,比如Winform几乎不能通过Mono移植到Linux上去,因此得出一个骇人听闻的结论:微软连模仿都没模仿完整,居然是伪跨平台。

以上就是目前我见过的最多的结论:.NET致命的弱点,就是它不是真正的跨平台。为此,我有以下几点说明:

(1).NET平台出现的意义不是支持跨平台,它出现的目的只是优化传统的Windows开发模式,使Windows开发更加方便快捷。它解决了COM时代的Dll Hell问题(.Net程序集版本控制),集成了多种语言(方便各种各样的程序员),每种语言编写的组件(程序集)之间可以毫无障碍地通讯,集合Object-Oriented和Component-Oriented于一体,你可以从一个组件(dll)中派生出一个新的类型而不需要该类型的所有源码(这个UnManaged时代不可能有),真正的实现了二进制兼容性(你改动程序集中的某一个公开成员,如果使用这个程序集的客户端程序没有使用到这个公开成员,那么客户端完全不需要重新编译),提供C++中没有的内存管理,支持异常处理等等。严格来说,微软发布.NET的第一天就是为了它的Windows,就没打算让你写的程序跑在其他操作系统之上(微软到目前为止还没有发布官方的非Windows平台的.NET CLR)。

(2)再说Java平台和.NET两者追求的目标,前者从出现开始就认为:在互联网世界中,我要让一种语言跑在任何一个操作系统中;而后者则认为:在互联网世界中,我要让所有的语言都跑在同一个操作系统中(Windows)。两个平台从一开始设计的目的就不一样。

(3)两者强调的重点不同:

如上图,红色部分都是其他人扩展出来的功能。

(4)上面3中所述,两者平台结构类似,我不清楚微软到底有没有剽窃Java,但可以肯定的是如果两者东家原意,两个平台都是可以做到“跨平台”和“支持多语言”的。 至于为什么说使用Mono还不能把有些.NET程序移植到Linux,这个很容易解释,微软本来就没打算将.NET程序移植到其他平台,.NET中包含的一些丰富框架都是与Windows紧密相关的,你使用了这些框架,是很难再把它们翻译成非Windows平台中可以执行的代码。而且,Java也并不是完全的跨平台,跟你开发实际用到的框架有关。出现以上不能移植的情况,关键有两个地方,一个是你开发时使用的框架,一个是CLR(或者JVM),要看后者到底有没有能力把前者翻译成对应平台的可执行代码。

综上,两个平台的侧重点不同。

---------------------------------------------分割线------------------------------------------------------

2014年11月17日更新:

以上是之前写的一篇博客。就目前微软决定.NET开源后,并支持多平台。那么3)中那幅图左边红色部分不再是意淫出来的产物。

以上一点拙见,话题较敏感,勿喷。

时间: 2024-08-30 12:32:22

.NET支持多平台后的一点拙见的相关文章

Android官方入门文档[11]支持不同平台版本

Android官方入门文档[11]支持不同平台版本 Supporting Different Platform Versions支持不同平台版本 This lesson teaches you to1.Specify Minimum and Target API Levels2.Check System Version at Runtime3.Use Platform Styles and Themes You should also read?Android API Levels?Androi

第二章SignalR所支持的平台

第二章SignalR所支持的平台 SignalR支持各种服务器和客户端的配置.此外,每种传输方式都有自身的配置要求和限制:如果某种传输方式不被系统支持,SignalR优雅地将故障转移到其他类型的传输方式.详细说明,请参阅上一章的传输方式和协商转换. 1服务器端要求: 1)  系统要求:win7,win8,win2008r2,win2012或以上系统 2)  .NetFramework版本要求:.NetFramework4.5或以上版本 3)  IIS版本要求: a)  IIS7,IIS7.5中,

【JavaScript】让事件支持先发布后订阅

之前写过一个的事件管理器,就是普通的先订阅后发布模式.但实际场景中我们需要做到后订阅的也能收到发布的消息.比如我们关注微信公众号,还是能看到历史消息的.类似于qq离线消息,我先发给你,你登录了就能收到了.就是确保订阅该事件的方法都能被执行. var eventManger = { cached: {}, handlers: {}, //类型,绑定事件 addHandler: function (type, handler) { if (typeof handler !== "function&q

【一起玩吧】活动社交APP出炉,目前只支持WP平台

还在苦恼周末没事干?还想继续选择宅在家里?平时没有小伙伴一起玩?加入我们,我们带你装B带你飞,看看周边有哪些有趣的活动,感兴趣?那就赶快加入进来. 找不到基友一起出去happy,试试发布一下你的点子,让大家看到你的活动,也许基友与你的距离近在咫尺.结交那些未曾有过交集的人们,也许你的女神就在里面. 我们的目的很单纯,一起玩,一起快乐,给我们的生活添加一点乐趣. 由于目前这款APP只在Windows Phone 8.1平台上架,可能没有想象中那么多人使用,不过即使是Windows Phone用户,

裸辞后的一点感悟

写给新入职场的新人,写给自己. 大牛除外. 先自我介绍一下,程序媴.985硕士毕业.直接进入一家跨国外企. 裸辞的原因 裸辞一个月了.至于裸辞的原因.想起了一句话"幸福的家庭是相似的,不幸的家庭各有各的不幸".裸辞最重要的原因是运气不好接触的项目太杂,再一中国好多外企核心技术不在中国.接触到的项目可以学到的东西也比較有限(或许片面了). 感悟 回忆自己一年多的工作,有几点非常深的体会,当然每一个人经历不同,这个不能代表所有. 懒惰固步自封是程序猿最大的敌人 看看论坛里.每个技术大牛首先

Android支持Split Apks后,如何获得指定包名下的所有类

从Android5.0以后,支持多个apk动态部署,这导致以前通过单一apk获取包路径下的所有类的方法失效,不过稍微修改一下原先的代码就可以,代码如下 1 public static final List<Class<?>> getClassesFromPackage(Context ctx, String pkgName) { 2 List<Class<?>> rtnList = new ArrayList<Class<?>>();

ASP.NET Core SignalR (二):支持的平台

此为系列文章,对MSDN ASP.NET Core SignalR 的官方文档进行系统学习与翻译.其中或许会添加本人对 ASP.NET Core 的浅显理解. 服务端系统要求 只要是ASP.NET Core支持的服务器平台都会支持ASP.NET Core SignalR. Javascript 客户端 JavaScript客户端 运行在NodeJS 8 以及后续版本中,支持的浏览器如下: 浏览器 版本 Microsoft Edge Current† Mozilla Firefox Current

读《量子之谜》后的一点思考

为了重构自己的知识体系,这段时间恶补了一点科普性知识.昨天在图书馆借了本<量子之谜>,这本书写得不错,翻译得也不错.基本上是一鼓作气读完的.读完书,照样得总结一下: 1)对于"薛定谔的猫": 量子处于叠加态(猫是死的,也同时是活的),经由"观察"向确定态塌缩(瞬间,不用时间,超越光速).从理解上来说也好理解,因为可以想象有一种爱因斯坦的"幽灵"在作用.但我的问题是这种经由"观察"而产生的塌缩是如何作用的,或者说是如

Entity Framework 6.0 对枚举的支持/实体添加后会有主键反回

实验 直接上代码,看结果 实体类 [Flags] public enum FlagsEnum { Day = 1, Night = 2 } public class EntityWithEnum { public int ID { get; set; } public FlagsEnum ValidTime { get; set; } } 数据库上下文 public partial class CodeFirstModel : DbContext { public CodeFirstModel(