Visual Basic の言語の変更
VBScript (ASP.NET では Visual Basic Scripting Edition) をサポートしていませんが、VBScript とたいへんよく類似した Visual Basic .NET をサポートしています。ただし、VBScript が含まれた既存の ASP ページのほとんどは、ASP.NET で実行するために、ある程度まで書き直す必要があります。
VBScript が含まれた既存の ASP ページに影響する可能性のある Visual Basic の特定の変更として、Visual Basic の構文の変更と、スレッド モデルの変更があります。以降のセクションでは、Visual Basic .NET を使用して、VBScript ASP アプリケーションを ASP.NET アプリケーションに変換する場合に処理する必要がある主な変更点について説明します。
Visual Basic の構文
既存の Visual Basic または VBScript アプリケーションの変更が必要となる可能性のある、Visual Basic .NET での個別の変更の一覧を次に示します。
データ型 Variant はなくなりました。代わりに Object 型に置き換えられました。Object 型は、ほかのプリミティブ データ型に明示的にキャストする必要があります。
パラメータを必要としないメソッドも含めたすべてのメソッドの呼び出しで、パラメータ リストをかっこで囲むようになりました。次に例を示します。
If Flag = False Then DisplayMessage()End If
既定では、Visual Basic の前のバージョンのような参照ではなく、引数が値渡しされるようになりました。引数を参照渡しする場合は、次の例に示すように、引数の前に ByRef キーワードを使用します。
Call MyFunction(argbyvalue, ByRef argbyref)
Set および Let はサポートされなくなりました。オブジェクトは、単純な代入演算によって代入できます。
Object1 = Object2
オブジェクトの既定のプロパティを設定するために、そのプロパティを明示的に参照することが必要になりました。次に例を示します。
ほとんどのオブジェクトが、既定のプロパティを持たなくなりました。インデックスで指定されていないプロパティはすべて、明示的に参照する必要があります。Visual Basic の以前のバージョンでは、オブジェクトの既定のプロパティにアクセスする場合、既定のプロパティの名前の指定は省略可能でした。たとえば、TextBox コントロールの Text プロパティにアクセスする場合には、次のようなコードを使用しています。
Dim str As String = TextBox1
これは、TextBox コントロールの既定のプロパティが Text プロパティであったためです。Visual Basic .NET を使用するには、このコードを次のように変更する必要があります。
Dim str As String = TextBox1.Text
Visual Basic .NET で既定のプロパティが利用できると仮定した場合、次のような式はあいまいです。
Object1 = Object2
Object2
がオブジェクト全体を指すのか、オブジェクトの既定のプロパティだけを指すのかが明確ではないからです。別の例として、Recordset (次の例では、
RS
) からフィールドを取り出す場合には、Field オブジェクトの Value プロパティを明示的に参照する必要があります。Response.Write ( Server.HtmlEncode(RS("au_fname").Value)) Indexed default properties are supported if the class contains a definition for an indexed property. The following expression is valid because the indexer makes it clear that an indexed property, not the object itself, is being referenced: MyProperty = Object2(6)
Integer データ型は 32 ビットになりました。Long データ型は 64 ビットです。
データ型は常にほかのデータ型に対して明示的にキャストします。たとえば、文字列が予期される場合は、常に数値を String にキャストします。
Response.Write("The count is " & CStr(count))
同じ Dim ステートメントで作成された変数は、型も同じになります。たとえば、Visual Basic .NET では、Dim ステートメント
Dim i, j, k As Integer
は 3 つの各オブジェクト (i
、j
、およびk)
を Integer として作成します。Visual Basic の前のバージョンでは、i
およびj
を Variants として作成し、k
を Integer として作成します。クラス プロパティの構文が変更され、Property Let、Property Get、および Property Set を含まないようになりました。新しいプロパティの構文は、C# の構文と似ています。
Public Property ThisProperty As String Get ThisProperty = InternalValue End Get Set InternalValue = value End Set End Property
文字列を連結するときは、常に & 演算子の前後にスペースを入れる必要があります。VBScript では
a&b&c
; と記述できました。Visual Basic .NET では、構文エラーを回避するためにa & b & c
と記述することが必要になりました。すべての If ステートメントは、複数の行で作成する必要があります。VBScript では、たとえば
If x Then y
のように、If ステートメントを 1 行で記述できました。Visual Basic .NET では、If ステートメントを次のように記述する必要があります。If x Then y End if
既定では Option Explicit はオンになっているため、変数を使用するには、あらかじめ使用する変数を宣言しておく必要があります。
スレッド処理
ASP.NET では、シングルスレッド アパートメント モデルではなく、マルチスレッド アパートメント (MTA) スレッド モデルを使用します。ASP.NET アプリケーションで使用される COM コンポーネントでは、最適なパフォーマンスを得るために、MTA モデルも使用します。MTA 環境での STA コンポーネントの使用については、「COM コンポーネントの互換性」を参照してください。
ASP.NET アプリケーションから ADO.NET を使用する場合は、Both スレッド モデルを使用して、ADO.NET コンポーネントをフリー スレッドになるように構成する必要があります。スレッド モデルを変更するための処理を行う必要はありません。.NET Framework セットアップ プログラムおよび Visual Studio .NET セットアップ プログラムは、spnet_isapi.dll を登録するときに ADO スレッド モデルを Both に自動的に変更します。
次のレジストリ データをインポートすることによって、フリー スレッド モデルを使用するように ADO.NET を設定できます。レジストリを変更するには、このデータを REG ファイル (たとえば、Adofre.reg) にコピーし、Regedit.exe プログラムを使ってそのファイルをインポートします。たとえば、Regedit /s Adofre.reg
を実行します。
Windows 2000 システムおよび Windows Server 2003 システム上の Adofre15.reg ファイルに次のレジストリ情報が含まれています。バッチ ファイル Makfre15.bat は、この Adofre15.reg 内の情報によってレジストリを更新します。両ファイルとも、Program Files\Common Files\System\ado\ にあります。
REGEDIT4
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{00000507-0000-0010-8000-00AA006D2EA4}\InprocServer32]
"ThreadingModel"="Both"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{00000514-0000-0010-8000-00AA006D2EA4}\InprocServer32]
"ThreadingModel"="Both"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{0000050B-0000-0010-8000-00AA006D2EA4}\InprocServer32]
"ThreadingModel"="Both"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{00000535-0000-0010-8000-00AA006D2EA4}\InprocServer32]
"ThreadingModel"="Both"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{00000541-0000-0010-8000-00AA006D2EA4}\InprocServer32]
"ThreadingModel"="Both"
ASP.NET アプリケーションから ADO.NET を使用する予定がない場合は、Visual Basic Version 6 で作成したレガシ アプリケーションなどで、アパートメント スレッド モデルを使用して、ADO.NET のパフォーマンスを向上させることができます。アパートメントのスレッド処理を構成するには、次のレジストリ データをインポートします。レジストリを変更するには、このデータを REG ファイル (たとえば、Adoapt.reg) にコピーし、Regedit.exe プログラムを使ってそのファイルをインポートします。
Windows 2000 システムおよび Windows Server 2003 システム上の Adoapt15.reg ファイルに次のレジストリ情報が含まれています。Makapt15.bat バッチ ファイルは、この Adoapt15.reg 内にある情報によってレジストリを更新します。両ファイルとも、Program Files\Common Files\System\ado\ にあります。
REGEDIT4
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{00000507-0000-0010-8000-00AA006D2EA4}\InprocServer32]
"ThreadingModel"="Apartment"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{00000514-0000-0010-8000-00AA006D2EA4}\InprocServer32]
"ThreadingModel"="Apartment"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{0000050B-0000-0010-8000-00AA006D2EA4}\InprocServer32]
"ThreadingModel"="Apartment"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{00000535-0000-0010-8000-00AA006D2EA4}\InprocServer32]
"ThreadingModel"="Apartment"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{00000541-0000-0010-8000-00AA006D2EA4}\InprocServer32]
"ThreadingModel"="Apartment"
参照
Visual Basic のプログラミング | Visual Basic .NET 言語仕様 | ASP ページから ASP.NET への移行