摘要:为什么borland创建vcl for .net?什么时候你该使用vcl for .net而不是.net系统本身的的windows forms框架?
delphi 8 for .net在delphi社群中引起了极大的关注!人们在新闻组,聊天室,以及用户们的小型聚会中频繁地谈论.net基础架构,谈论它与我们都熟悉的win32平台的关系。
其中一个热点话题是delphi8的vcl for .net。大部分争论似乎都集中在这个问题上:在这个宏大的规划中,vcl for .net的目的是什么?它是一个短期的移植桥梁还是一个长期的应用框架。为什么borland要创建这些东西来和微软的winforms竞争?这是明智之举还是缺乏谨慎?
安静一下吧,没有必要再为这个问题争论不休了,真的。原因如下。
背景
微软的.net框架提供了一个硬件中立的执行环境和语言无关的类型系统。这很好,但是要产生基于windows操作系统的客户端应用程序还不够。.net还包括了windows窗体("winforms")应用框架来为win32操作系统创建图形界面应用程序。熟悉在delphi或c++builder中的 borland vcl应用程序架构的程序员们将会在.net的winforms框架中找到许多曾经相识的设计模式。这并不很奇怪:就像anders hejlsberg所说的那样,“是好机制那为何不用呢”。
虽然vcl与winforms之间有很多相似之处,但实质上要移植现有的win32 vcl应用程序到winforms上是非常困难的,也是很痛苦的。而且这将限制采纳新的思路。相应的(软件)工具的销售也会带来同样的问题。
.net是一个新的平台。在软件行业中,甚至所有新的活动都基于.net,相对于现存的和正在进行的win32开发而言,.net应用程序开发仍只是很小的一部分。我们早些时候关于客户对于.net平台兴趣的调查,非常清楚地表明,许多borland客户对于.net是一种不确定的兴趣,他们承担不起放弃在win32平台上的所有投资的代价,而完全在新的.net平台上从头开始。今天仍然如此,而且这种情形还将持续多年。
在delphi 8 for .net中创建一个winforms是轻而易举的。现有的delphi开发者们告诉我们:“这很好,但是我们能用它来为我们的vcl代码做什么呢?这些代码都是以前创建的,我们的业务都依赖于这些代码。”
为了让我们的客户更加满意,并且让.net平台对于现有的delphi开发者来说更加有吸引力,需要有一些东西来填补现存的win32开发与新的.net开发之间的鸿沟。它需要像.net框架本身一样是一个纯粹的.net,它还需要提供一个与现有win32 vcl结构之间的高度兼容性。为了吸引现有的vcl开发者, delphi for .net需要的是一个在.net平台上的实现的vcl。
我们首先考虑了在winforms框架的之上实现vcl。在一些初步研究之后,事情变得很清楚,使得移植vcl应用程序到winforms上很困难的架构差异,同样也使得很难在winforms框架之上再建造一个vcl层,并且按照vcl的方式工作。
在我们评估winforms的过程中,我们注意到winforms其实是建立在win32 api调用之上的。winforms 窗口类调用createwindow()创建wind32窗口句柄,它们勾住win32的wndproc函数来侦听窗口消息,并且在类中触发相应的事件,等等,等等。
它们的工作原理就像vcl一样
如果在被托管的.net代码中进行win32 api调用对.net框架适用,那么它对vcl也同样适用。这样,在.net平台上实现vcl的过程就变成了找出如何进行win32 api调用的方法,这是现存的vcl架构所依赖的,同时在我们可管理的范围内,又要对vcl自身代码的修改最少。
vcl for .net的情况
vcl架构是与微软的winforms架构对等的,而vcl for .net是vcl架构的继续与演进。winforms与vcl for .net都建立在对win32 api的调用之上,所以有相似的平台约束与相似的执行特征。对于vcl而言,甚至还有潜在的机会能比winforms运行得更出色,这是因为vcl实现了针对笔,刷子,以及设备上下文的句柄共享,而winforms没有。微调与探索这些性能方面的机会是delphi开发小组持续的任务,就像微调winfrorms的性能与.net的性能是微软持续的任务一样。
vcl已经被证明可以适应于平台的变化—从16位windows到32位的win95,从nt到在linux上基于qt的clx。winforms与.net紧紧地捆绑在一起,而且在很大程度上与win32捆绑在一起。
说明: 虽然.net精简框架实现了winforms命名空间中的许多类,在cf上还是有许多东西是不同的或者简单地缺失了。我不认为cf winform与win32 winforms在任何有意义的程度上是兼容的。微软显然承认这一点,因为他们让.net cf执行环境与win32 .net的执行程序在二进制级别上就不兼容。.net cf系统的assembly是强命名的,使用的是与win32 .net系统的assembly不同的关键字,这样,win32 .net执行程序将会在cf设备上装载失败。唯一的进入.net cf的方法是把源代码在cf上重新编译,并且与cf的assembly链接起来。
对于应用程序代码来说,从win32 vcl移植到vcl for .net是相当简单的,但对于那些与win32 api的关系更加紧密的组件来说,将可能需要更多的一点工作。这与移植到clx的情况很相似。然而,delphi开发者会发现,从win32 vcl移植到vcl for .net所需的努力要比从win32 vcl移植到clx所需的努力要少。vcl for .net在很大程度上改变了执行环境,但实现了与win32 vcl几乎相似的消息处理,异常处理,以及win32 api支持。而clx为了在linux平台上运行不得不牺牲消息处理与win32 api支持。
vcl for .net的代码移植并不是单向的。为vcl for .net 编写的应用程序代码也能在一个合理的范围内反过来被移植到win32 vcl上。再一次地,要维护跨平台的同一份源代码,那些离win32调用很近的操作代码(如定制控件),要比用常规delphi语法编写的应用程序业务逻辑,会更困难一些。(常规的意思是避免不确定的类型转换与指针运算。)
用c#来编写应用程序就要让开发者们完全抛弃他们现有的代码与开发经验,在.net中从头学起。c#把开发者完全限定在锁定的.net平台上。在其它平台上并没有c#的实现。(是的,在linux上有mono,但它并没有实现ui/winforms支持,因此它并不是一个完全的客户端应用程序开发的解决方案。)vb.net几乎处于同样的境地,因为vb.net用户痛苦地抱怨vb.net与vb连基本语法都不兼容,这使得在vb.net与vb之间移植代码比完全重写还要冒风险。
用delphi语言为.net平台编写程序还提供了将代码移植到其他非.net平台(windows与linux)上的机会。用vcl for .net来编写应用程序提供了任何其他.net语言都没有的移植选项。
vcl for .net是为delphi程序员而存在的
vcl结构依赖于delphi语言的几种强劲特性,这几种特性在其他.net语言(包括c#)中一般都是没有的。然而,我并不期望c#或者vb程序员对vcl for .net有浓厚兴趣。c#代码可以利用vcl for .net组件,但vcl的某些方面(比如虚拟构造器)在c#中将是不显著且难以使用的。
用vcl for .net实现的gui控件只有delphi程序员感兴趣,c#或vb.net程序员都没有多大兴趣。
只要delphi开发者保持这样一种观念,即某些独特的delphi语法,并不能被c#或者其它.net程序员很好地理解的话,如虚拟类方法,虚拟构造器,集合,标准化字符串,以及类引用,那么非可视组件,工具类,业务逻辑都能用delphi实现并且被c#或vb.net程序员方便地使用,
在vcl for .net窗体上能放置winforms控件。delphi开发者编写的vcl for .net应用程序能同时使用vcl for .net组件与控件,就像使用任何winforms组件与控件一样。
也许比实际的源代码更重要的是开发者的开发技能。对vcl熟悉的开发者立即就能对vcl for .net熟悉起来。在win32 vcl中你怎样创建一个应用程序,或者创建一个定制组件,或创建一条定制的消息处理,在vcl for .net中你就怎样创建,两者的方式是完全一样的。vcl for .net让熟练的delphi开发者能在.net平台上立即变得富有生产力,而避免花去典型的三到六个月的额外时间来为一个不同的应用框架结构对
开发者进行再培训。
delphi语言是独立于vcl的
vcl for .net依赖于delphi语言的一些特性,但delphi语言本身并不需要vcl。你能直接用delphi语法编写winforms应用程序,而不必将vcl for .net拖入你的应用程序里。你也能用你熟悉的delphi rtl工具函数与类来编写winforms应用程序,这样的好处就是,例如,你不必花时间来找在.net中与delphi的inttostr()等价的函数是什么。
每一种编程语言都必须定义它如何把它的语言特性与下层平台可用的架构绑定起来。在.net中,这种下层架构包括象核心语言类型这样的代码。delphi语言拥有clr没有实现的概念与语义,所以delphi在语言绑定上需要一点代码来补充clr没有提供的部分。这种语言绑定可能被直接联接到你的delphi应用程序的exe或者assembly中,或者你也可以联接一个外部的叫做borland.delphi.dll的assembly(pacage)。
每一种.net语言都有一个语言绑定库。vb.net的microsoft.visualbasic.dll大小大约为300k。jscript的microsoft.jscript.dll大小约为700k。c#的语言绑定库大小大约为3到20mb,这依赖于你是否把mscorlib.dll 与system.dll也考虑进去,或者计算所有的c#需要的.net框架的最小安装。delphi的borland.delphi.dll在大小上小于64k。
无论是投资到vcl源代码与开发者技巧集(使用vcl for .net)的人们,还是那些愿意从头启动一个只运行在.net平台(使用winforms)上的项目的人们,delphi for .net都会引起他们的兴趣。
未雨绸缪
在微软的长期平台/操作系统路线图上,已暗示了在windows操作系统的下一个主要发布版本中将有重大的改变。很清楚,代号为“长角”的微软操作系统将会同时有界面表示与下层实现的重大转变。win32 api将会变成在遗留的win32程序与实际的os表示层之间的一个可兼容的层。微软已经为长角操作系统建立了一个新的应用框架(“avalon”)。你可以在msdn上读到更多的关于该框架的信息。
改变很多时候会引起惊慌。所以很高兴从微软处得知winforms应用程序可以继续在长角及其后续版本上使用。vcl for .net是建立在与winforms相同的基础上的,所以vcl for .net应用程序应该也可以继续在长角及其后续版本上运行。vcl已经经受住了几次平台移植的考验(从win16到win32,从win32到linux,现在又从win32到.net),这比winforms还多,所以有理由认为vcl fot .net比winforms更容易适应在长角操作系统中会发生的改变。
所有这些加起来使得vcl for .net成为一个比winforms架构更强大的同类体系。对于现存的vcl应用程序而言,比起为winform而重写代码这种方式,vcl for .net具有更长的可用的生命期,而不是作为一个临时的单向过渡方案,而且还有更好的投资回报(roi)。
为什么要改写你的应用程序?把你现有的vcl应用程序移植到vcl for .net可以以更少的努力获得同样的结果。即使vcl for .net与winforms在同一条船上翻掉,vcl for .net也意味着比winforms有更好的投资回报。
这就为什么我们建立vcl for .net的原因。
结论
对于新的应用程序开发而言,微软的.net平台windows窗体应用架构是完全(由微软–译注)有意确立的一种合理的架构,然而采用winforms的代价是昂贵的,因为它不能把现有的源代码移植上去。
borland的vcl for .net架构为delphi开发者提供了最好的两个方面:它可以让你利用现有的源代码和开发经验在一个新的正在壮大的.net平台上进行开发,同时只需最少的时间损失来使用新的工具与再学习。
