告别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+来部署,以上设置都适用。
