相关资源
搜索
广告是为了发展
你的位置:首页 > 学习 > 代码
 
ASP.NET移植须知
 
作者:不详   来源:网络   编辑:阿志
[字体: ]
 
正如我所提到过的,VBScript 已被更全面更强大的Visual Basic .NET所取代。在这部分,我会强调那些您可能会碰到的与Visual Basic语言变化相关的问题。请注意我并不会列出关于Visual Basic所有的变化,而只会着眼于一个由Visual Basic .NET转向ASP .NET的ASP/VBScript 程序员可能会遇到的情况。欲知所有语言变化,请参考Visual Basic .NET相关文档。


告别Variant数据类型


我们知道它,我们爱它,我们也恨它。我说的当然是VARIANT数据类型。VARIANT数据类型不是.NET的一部分,所以在Visual Basic .NET中也不支持它。这也就意味着您所有的ASP变量正在不知不觉地从VARIANT数据类型转为对象类型。您的应用程序里的大多变量应根据需要改为相应的基元类型。如果您的变量在Visual Basic术语中确实是对象类型,只需在ASP.NET中简单声明其为Object即可。


Visual Basic 数据类型

一种一定会引起特别关注的VARIANT是VT_DATE数据类型。在Visual Basic中它被表示为Date类型。在Visual Basic中,Date 是以4个字节的双字节格式存储的。在Visual Basic.NET中, Date使用Common Language Runtime DateTime 类型,用8个字节整数来存储。

既然在ASP中,所有变量都是VARIANT数据类型,您使用的Date变量会被编译,也可能继续工作(这取决于他们是如何被正确使用。)可是,您在使用这些变量时,也有可能会遇到各种各样的问题,因为它们实际的数据类型已经改变。在把数值作为长整数类型送入COM对象或是对日期类型用CLng实施某些转换操作时,尤要注意。


Option Explicit 现为默认

在ASP中,Option Explicit 没有被规定为默认设置。Visual Basic .NET在这点上作了改变。Option Explicit成为默认值,因此,所有变量都需要声明。如果更严格一些的话,可以把您的设置变为Option Strict,这样可以迫使您声明所有的变量为某种数据类型。虽然这看似冗余,却是您应该坚持的做法。如果您不这样做,您的代码远远不可能优化,因为所有未经声明的变量会变成Object 类型。大多数隐性转换仍会有效,但如果您声明清楚所有变量的话,以后您就可以更安心了。


LET 与 SET不再被支持

对象可以像这样直接赋值:MyObj1 = MyObj2。如果您的程序里有SET 或LET 关键字, 它们必须被移掉。


用括号实现方法调用

在ASP中,您无须使用括号就可以自由调用对象的方法。例如:

Sub WriteData()
Response.Write "This is data"
End Sub
WriteData

在ASP .NET中, 做任何调用,您都必须使用括号,即使是不使用任何参数的方法也是一样。按照如下例所示方法书写代码,可以使代码在ASP与 ASP.NET环境中都工作无误。

Sub WriteData()
Response.Write("This is data")
End Sub
Call WriteData()



ByVal成为默认

在Visual Basic中,所有参数默认以引用(或ByRef)方式来传递。在Visual Basic .NET中有所改变。所有参数默认以值(或ByVal)传递。如果您仍然希望以引用来传递,您必须在参数之前清楚注明ByRef关键字。例如:

Sub MyByRefSub (ByRef Value)
Value = 53;
End Sub

这就是您必须非常小心的地方。当您将您的代码转向ASP.NET,我建议您对方法调用中的每个参数作两次甚至三次的检查,以确保这种变化确实符合您的期望。我估计,在检查过程中,总会查出些错误。


不再有默认属性


默认属性的概念不再存在于Visual Basic .NET。 这也就意味着如果您有依赖于来自某对象的默认属性的ASP代码,您将需要加以修改,以显式地引用所需属性。请见下例:

'ASP Syntax (Implicit retrieval of Column Value property)
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open("TestDB")
Set RS = Conn.Execute("Select * from Products")
Response.Write RS("Name")

'ASP.NET Syntax (Explicit retrieval of Column Value property)
Conn = Server.CreateObject("ADODB.Connection")
Conn.Open("TestDB")
RS = Conn.Execute("Select * from Products")
Response.Write (RS("Name").Value)



数据类型的变化

在Visual Basic .NET,整数值现在是32 位。Long数据类型为64 位。

当从ASP.NET中调用COM对象的方法或是在您自定义Visual Basic components组件中调用Microsoft® Win32® API,都可能发生问题。您特别要注意实际需要的数据类型,以确保您正确传递数值。


结构化的例外处理

虽然在Visual Basic .NET中,仍然沿用熟悉的On Error Resume Next 及On Error Goto 错误处理方法,但是,它们不再是最好的方法。Visual Basic现在有成熟的,系统的例外处理方法。它们使用Try, Catch, 及 Finally等关键字。如果有可能的话,您应该转向这种新的错误处理模式,因为它运用了一个性能更加完善,稳定的机制来处理应用程序错误。

与前面介绍的.NET 框架与ASP.NET相比,COM基本没有变化。但是,这并不是说您从ASP.NET上运用它们时,您完全不需要顾及COM对象及它们的行为。以下是几点您必须注意的要素:


线程模式变化


ASP.NET线程模式是Multiple Threaded Apartment (MTA). 这就是说,您所用的为Single Threaded Apartment (STA)而生成的组件,在ASP.NET中,如不采取特别预防措施,不再会可靠工作。这包括,但不局限于,用Visual Basic 6.0及先前版本生成的所有COM组件。


ASPCOMPAT 属性

现有的STA组件不需要任何修改就能使用。 您所要做的仅仅是在ASP.NET页面的<%@Page>标签中加入指示兼容的属性aspcompat=true。比如,<%@Page aspcompat=true Language=VB%>。使用这个属性会强制该页面在STA模式下执行,从而确保您的组件正常工作。如果您的页面不指定本属性而直接引用STA组件,在运行时将发生异常。

设置aspcompat=true也将使您的页面能够调用那些需要使用ASP内建对象的COM+1.0组件。这可以通过ObjectConect对象来实现。

设置本属性会导致一定的性能下降。我建议您仅在必要的情况下使用它。


预先绑定与滞后绑定

在ASP中,所有对COM组件的调用都是通过IDispatch接口进行的。由于所有调用都需要在运行时由IDispatch间接处理,我们称之为滞后绑定。在ASP.NET中,如果您愿意,您仍然可以使用这种方式来完成对象调用。
Dim Obj As Object
Obj = Server.CreateObject("ProgID")
Obj.MyMethodCall

以上代码能够工作,但这并不是我们所推荐的用法。在ASP.NET中,您可以利用预先绑定直接创建您需要的对象:
Dim Obj As New MyObject
MyObject.MyMethodCall()


预先绑定能使您的页面在与组件的交互过程中避免出现类型错误。为了使用预先绑定,您需要在项目中加入一个引用,正如您在VB6.0项目中加入一个COM组件引用一样。假设您使用的开发工具是Visual Studio.NET,VS.NET将会在后台创建一个位于COM组件之上的代理对象,让您感到就像在使用.NET组件一样方便。

至此您可能会提出性能问题。为了保证与COM的互操作性,我们引入了代理对象,这的确会带来一定的性能负担。然而,在大多数情况下,您并不需要担心由此而引发的性能下降。毕竟,与冗长的IDispatch调用相比,代理对象所执行的CPU指令几乎可以忽略不计。您所赢得的远远超过您所失去的性能。当然,理想的状况是完全使用新创建的,被管理的(Managed)对象。然而,理想状况近期还不可能达到——我们必须保护在过去几年里对COM技术的投资。


OnStartPage和OnEndPage方法

在使用传统的OnStartPage和OnEndPage方法问题上,您可能需要多花一些时间。如果您依赖于这两个方法来访问ASP固有对象,那么您需要使用ASPCOMPAT指令,然后用Server.CreateObject以预先绑定的方式来创建对象。见下例:
Dim Obj As MyObj
Obj = Server.CreateObject(MyObj)
Obj.MyMethodCall()

请注意我们没有用“ProgID”,而是用了预先绑定的实际对象类型。为了保证以上代码正常工作,您需要在Visual Studio项目中加入对该COM组件的引用,以便VS创建一个预先绑定的包装类。这里是您必须继续使用Server.CreateObject的唯一理由。


COM小结


表2列出了您为了继续有效使用现有的COM组件所必须做的事情。

表2. 传统COM对象的ASP.NET设置

COM 组件类型/方法

ASP .NET 设置/例程

Custom STA (Visual Basic 组件 或其它被标志为"Apartment"的组件) 使用 ASPCOMPAT属性, 和预先绑定
Custom MTA (或其它被标志为"Both" or "Free" 的ATL 或自定义的 COM组件) 使用预先绑定,不当但不要用 ASPCOMPAT属性
内置对象 (通过ObjectContext 对象来访问) 使用 ASPCOMPAT属性, 和预先绑定
OnStartPage, OnEndPage 使用 ASPCOMPAT属性, 和Server.CreateObject(Type)

无论您的组件是否使用COM+来部署,以上设置都适用。

上一页 [1] [2] [3] 下一页

 
--------------------------------------------------------------------------www.Cbcz.com
  • 下一篇:ASP.NET Caching
  • 发表评论】【加入收藏】【告诉好友】【关闭窗口