VB6

VB6ユーザーのためのVB.NET移行ガイド

Visual Basic 6.0 ユーザーのための移行ガイド~やっぱりVBが好き~

Visual Basic 6.0ユーザーのためのVisual Basic .NET移行ガイド
第1章 Visual Basic 6.0からVisual Basic .NETへ
第2章 Visual Basic .NET の利点
第3章 スムーズな移行のためのポイント~アーキテクチャ編~
第4章 スムーズな移行のためのポイント~プログラミング編~
第5章 スムーズな移行のためのポイント~フォームとコントロール編~

第1章 Visual Basic 6.0からVisual Basic .NETへ

Visual Basic .NETを使う

・Visual Studio .NETをインストールして使う

Visual Basic .NETを使うと、はじめはVisual Basic 6.0との違いに驚くはずです。フォームにコントロールを貼り付けるとそれによってコードが生成されたり、フォームにClassというキーワードが付いていたり、そもそも、VBフォームではなくWindowsフォームになっていたり。
そして、さらに使っていくと、実はそんなに変わってはいないことにも気づくでしょう。
たとえば、「ボタンをクリックすると、メッセージが表示される」アプリケーションを作成するためのプロセスは、Visual Basic 6.0もVisual Basic .NETもまったく同じです。

・プロジェクトを作成する(図1
・フォームにコントロールを貼り付ける(図2
・コントロールをダブルクリックし、イベントプロシージャに「メッセージを表示する」コードを追加する(図3
・[開始]ボタンでテスト実行する(図4

図1:プロジェクトの作成
図2:コントロールを貼り付ける
図3:コードを追加

このとき、メッセージを表示するためのMsgBox関数もVisual Basic 6.0と同様に利用することができます(Visual Basic .NETでは、戻り値を利用するかしないかにかかわらず、引数を囲む“(”と“)”が必要です)。

図4:テスト実行結果
MsgBox("Hello World!")

さらに、Visual Basic .NETでは、.NET Frameworkクラスライブラリを利用することもできます(PlusOne参照)。

MessageBox.Show("Hello World!")

とにかくVisual Basic .NETを使ってみてください

幸い、Visual Basic .NETはVisual Basic 6.0と共存可能です。今、Visual Basic 6.0の開発環境を利用していても、同じマシンでVisual Basic .NETを利用することができます。
Visual Basic .NETを利用するためには、Visual Studio .NETをインストールします。.NET Framework SDKだけをインストールしてもコンパイルや実行はできますが、ウィザードやデザイナ、デバッガなどのVisualな開発環境を利用したければ、Visual Studio .NETをインストールします。
セットアップを開始すると、まずWindowsのアップグレードが行なわれ、続いてVisual Studio .NETがインストールされます。
たしかに、Visual Basic 6.0からVisual Basic .NETへの変更は小さなものではありません。
しかし、それをVisual Studio .NETやそれが提供するツールがカバーし、移行をサポートしてくれます。Visual Basic .NETの新機能を正しく理解し、準備することで、Visual Basic 6.0ユーザーにとってVisual Basic .NETによる開発は思ったほど大きなハードルではなくなるでしょう。
本書では、

・なぜVisual Basic .NETへの移行が必要なのか
・どのような点が変わるのか
・その準備のために今何ができるのか

について解説します。ぜひ、Visual Basic .NETを実際に使いながら読み進めていくことをお勧めします。
トレーナーをやっている関係で、よく「Visual Basicってかなり変わっちゃうんですよねー」とか「やっぱり、これからはC#ですか?」といった声を耳にします。いつも次のようにお答えします。「思ったほどは変わっていませんよ。それより、すごい進化しているんでぜひVisual Basic .NETを触ってみてください。多分、気に入ってもらえると思いますよ」と。

Plus One

MsgBoxとMessageBox.Showを比較する

MsgBox関数を利用しても、MessageBox.Showメソッドを利用してもメッセージボックスを表示することができます。図5のふたつのコードの実行結果を比較してみてください。

MsgBox("HelloWorld!",MsgBoxStyle.OKCancel, "Message")
図5:同じメッセージボックスが表示される
MessageBox.Show("HelloWorld!","Message",MessageBoxButtons.OKCancel)

同じメッセージボックスが表示されます。実際にMsgBox関数は、内部でMessageBox.Show
メソッドを呼び出しています。
また、次のコードの実行結果を比較してみて下さい。

MsgBox("Hello World!")
MessageBox.Show("Hello World!")
図6:MsgBox(“Hello World!”)の実行結果(左)とMessageBox.Show(“Hello World!”)の実行結果(右)

タイトルバーに注目してください。MsgBox関数では、第3引数を省略したときプロジェクト名が表示されます(図6の左)。これはVisual Basic 6.0のMsgBox関数と同じです。MsgBox関数では、引数が省略された場合にプロジェクト名を参照するコードが実行されます。これは便利ともいえますが、その分冗長なコードが動いているともいえます

Visual Basic 6.0からVisual Basic .NETへ

・よりパワフルに再設計された開発ツール
・ターゲットは大規模エンタープライズシステム
・オブジェクト指向のサポート
・Frameworkの採用
・ただし、「Visual Basic 6.0との100%の互換性」はない

Visual Basic 6.0でも、n階層の分散型システムを開発することができました。しかし、Visual Basic .NETは、より大規模で高性能なエンタープライズ向けのシステムやXML Webサービスを、簡単に作成できることを目的に開発されました。
そのため、Visual Basic 6.0に対して単なる機能追加が行なわれただけでなく、製品の再設計が行なわれました。利用できるアーキテクチャ、文法、オブジェクトなど多くの点が変更されています。
まず、Visual Basic .NETではオブジェクト指向が完全にサポートされるようになります。たとえば、

・コードの継承
・オーバーロード
・オーバーライド
・コンストラクタ/デストラクタ

が、利用可能になりました。Visual Basic 6.0でも、COMで必須の「インターフェイスの継承」は可能です。しかし、他のオブジェクト指向言語にあるような「コードの継承」がVisual Basicにはない! といわれていましたが、Visual Basic .NETからはこの機能を利用できます。
そして、なんといってもVisual Basic 6.0からVisual Basic .NETでの最大の変更点は.NET Frameworkの採用です(第2章の「.NET Framework」参照)。
これにより、Windowsフォーム、ASP.NET、ADO.NETなどが利用できます。また、レガシーな機能が排除されたことや、共通言語ランタイム、共通の型システムを使用することにより、C#などの他の.NET対応言語との相互利用性が高まりました。これで、Visual Basicから各種APIを利用するときに発生していた、Visual BasicとVisual C++間の型の違いによる苦労なども解決されます。
このようなさまざまな恩恵の代償として、「Visual Basic 6.0との100%の互換性」はなくなりました。
従来のコードは、そのままではビルドエラーになったり、ランタイムエラーになったりします。Visual Basic 6.0からVisual Basic .NETへの変更点を考慮し、修正が必要です。
ただ、この変更を自動で行なってくれるツールとして、アップグレードウィザード(後述)があります。このツールは、変更された多くの部分を自動的にアップグレードしてくれます。このツールでアップグレードした後に、自動的に変更されなかった部分にのみ修正を加えることで、移行に関する作業を大幅に軽減することができます。

Visual Studio .NET 言語の選択

・Visual Basic 6.0/ASP(VBScript)/VBAユーザーはVisual Basic .NET
・Visual C++ 6.0ユーザーはC#.NET Frameworkは、20種類以上もの言語に対応しています。

MicrosoftだけでもVisual Basic .NET、C#、C++、Java言語、JScript .NETと5つの言語に対応しています。
これだけの言語の中で開発者はいったいどの言語を選択すればいいのでしょうか。
MicrosoftはC#を推奨しているのでしょうか?
「いいえ、そうではありません!」(Microsoft Visual Studioプロダクトマネージャ談)。
実際に、.NET Frameworkのパワーは、どの言語でも同様に活用することができます。Visual Studio 6.0世代では、Visual Basic 6.0の持つ生産性とVisual C++ 6.0の持つパフォーマンスを組み合わせることにより、最強のアプリケーションを構築することができました。
図7に示した各言語の位置付けからもわかるように、Visual Basic .NETとC#は、Visual Basic 6.0にまさる生産性と、Visual C++ 6.0と肩を並べるパフォーマンスを共に実現しています。もはや、性能論議で各言語を比較する時代は終わったのです。

図7:各言語の生産性とパフォーマンス

開発者は、生産性や、パフォーマンスではなく、好みの言語、使い慣れた言語での開発をすることができます。Visual Basic 6.0、ASP(VBScript)、VBAユーザーにとって、Visual Basic .NETとC#、どちらが早く習熟でき、効率よく開発できそうでしょうか?
ここが選択のポイントになります。
実際にVisual Basic .NETとC#をコンパイルすることによって得られる実行コード(MSIL)を比較してみます。
まずは、それぞれの言語で同じことを実行するコードを作成します(リスト12)。

リスト1:Visual Basic .NETサンプルコード
Sub Proc1()
    Dim x, y, z As Integer
    x = 10
    y = 20
    z = x + y
    Console.WriteLine(z)
End Sub
リスト2:C#サンプルコード
void Proc1()
{
    int x, y, z;
    x = 10;
    y = 20;
    z = x + y;
    Console.WriteLine(z);
}

その後、コンパイル(ビルド)し[注1]、その中のコードをILDASM.EXEで覗いてみます。

リスト3:ILDASM.EXEで覗いてみる
.maxstack 2
.locals init ([0] int32 x,
    [1] int32 y,
    [2] int32 z)
IL_0000: ldc.i4.s 10
IL_0002: stloc.0
IL_0003: ldc.i4.s 20
IL_0005: stloc.1
IL_0006: ldloc.0
IL_0007: ldloc.1
IL_0008: add
IL_0009: stloc.2
IL_000a: ldloc.2
IL_000b: call void [mscorlib]System.Console::WriteLine(int32)
IL_0010: ret

すると、それぞれ異なる言語からコンパイルされた結果、リスト3のような同じコードが生成されることがわかります。


注1)このとき、ビルドオプションが異なると結果が異なることがあります。なお、Visual Basic .NETとVisual C#のデフォルトのビルドオプションは異なるため、デフォルトのままでは同じコードは生成されません

アップグレードウィザードの利用

・Visual Basic 6.0プロジェクトをVisual Basic .NETプロジェクトにアップグレードする
 コマンドラインツール
 アップグレードウィザード

Visual Basic 6.0で作成したプロジェクトは、ツールによりアップグレードできます。
コマンドラインから、Vbupgrade.exeの引数にプロジェクトを指定することでアップグレードできます。このとき、オプションを指定することも可能です。
また、 Visual Basic 6.0のプロジェクトをVisual Studio .NETで開くと、自動的にウィザードが起動し(図8)、プロジェクトをアップグレードできます。このとき、ウィザード形式でオプションを指定することができます(図9)。

図8:アップグレードウィザード

注意しなくてはいけないことは、アップグレードウィザードがアップグレードしてくれるのは「Visual Basic 6.0のプロジェクトのみ」、つまりVisual Basic 6.0でコンパイル、実行が可能なもののみ、という点です。Visual Basic 5.0以前のプロジェクトをアップグレードする場合は、まず、Visual Basic 6.0のプロジェクトへのアップグレードを行ない、その後、.NETにアップグレードします。具体的には、コントロールはVBXではなくActiveXコントロール(OCX)にアップグレードしておく、Visual Basic 6.0でコンパイル&実行が可能であることなどがそれにあたります。
アップグレードウィザードを利用すると、次の点が変更されます。

・Visual Basic 6.0からVisual Basic .NETに言語レベルでアップグレード
・フォームやコントロールのアップグレード
・アーキテクチャやデータアクセス手法のアップグレード

一般に、95%が自動アップグレードされ、残りの5%を手動でアップグレードする必要があるといわれていますが、プロジェクトのタイプによって、この数字は異なります。また、あらかじめVisual Basic 6.0でどのようなプロジェクトを作っていたかということも影響します。この手動によるアップグレードを最小限に抑えるための方法は第3章第5章で解説していきます。

図9:ウィザードによるアップグレード

アップグレードウィザードの効果

・コードのアップグレード
・フォームのアップグレード
・その他のアップグレード(リソースファイル、ADOなど)

コードのアップグレード

データ型、構文などは、意味的に同じになるように適切にアップグレードされます。
たとえば、VariantはObjectに、整数型はその大きさを保つ違う名前のオブジェクトに変換されます。
また、デフォルトが変更になっている場合なども、Visual Basic 6.0でのデフォルトを明示的に付加することで、元のプログラムの意図を引き継ぎます。たとえば、Visual Basic 6.0では引数になにも指定しないとByRefでしたが、Visual Basic .NETではByValがデフォルトになっています。そこで、Visual Basic 6.0でなにも指定がない場合、Visual Basic .NETにアップグレードするとウィザードがByRefを追加してくれます。
詳細は、第4章を参照してください。

その他のアップグレード

リソースファイル(.res)は、国別のXML形式のファイル(.resx)に変更になります(従来のresファイルが使えなくなったというわけではありません)。
Web Classデザイナを利用しているプロジェクトはASP.NETにアップグレードされます(ただし、Visual Studio .NETベータ版ではエラーになり、変更はできません)。
ADOはADO.NETではなく、ADO 2.7にアップグレードされます。ADOのコードやコントロールとバインディングされているデータなども適切にアップグレードされます。さらに、DataEnvironmentで実現していたものも、Visual Basic .NETに変更されます。
詳細は、第3章を参照してください。

フォームのアップグレード

VBのFormは、Windowsフォームに置き換えられます。VB Formのメソッドやプロパティも、できる限り対応するメソッドやプロパティに置き換えられます。
標準コントロールの多くも、対応する新しいコントロールに置き換えられ、ActiveXコントロールを利用している場合も、必要なラッパークラスや設定が自動的に追加されるため、ほとんどそのまま利用可能です。
詳細は、第5章を参照してください。

Plus One

アップグレードウィザードの本当の活用法、それは、ずばり、

プログラムの移行より、プログラマの移行(!?)

アップグレードウィザードを利用すると、Visual Basic 6.0のプログラムをVisual Basic .NETにアップグレードできます。すでに紹介したように、フォームや、コードをできる限りアップグレードしてくれて、さらに、レポートやコメント(詳細は、「アップグレードレポートとアップグレードコメント」を参照)まで付けて、手で修正すべき部分を指摘してくれます。もちろん、この機能を利用して、プログラムをスムーズにアップグレードすることができます。
アップグレードウィザードのもうひとつの使い方として、これをVisual Basic .NET学習のためのツールとして利用することができます。既存のプログラムをアップグレードウィザードにかけてみると、既存のコードのどの部分が変わらず使えて、どこを変更すべきかが一目瞭然です。また、どのように直せばよいか、あるいは、根本的に変更しなくてはいけないところはどこかを知ることもできます。
そのような観点から、アップグレードウィザードを活用してみてください。さっそく、今お持ちのVisual Basic 6.0プロジェクトをVisual Basic .NETにアップグレードしてみてください。グッとイメージがわき、効果的なVisual Basic .NETの予習ができます。

アップグレードレポートとアップグレードコメント

  • アップグレードレポート
    • アップグレードに関する情報の一覧
    • 重大度レベルとオンラインヘルプへのリンク
  • アップグレードコメント
    • コード内に挿入
    • 重大度レベルとオンラインヘルプへのリンク
    • タスクリストに表示

Visual Basic 6.0のグラフィック関連の標準コントロール(LineコントロールやShapeコントロール)は、Visual Basic .NETでは使えません。これらのコントロールは、できる限り他のコントロールに置き換えられますが、適切にアップグレードできない場合は、赤色のラベルになって警告されます。
たとえば、Lineコントロールを利用している場合、アップグレードウィザードでアップグレードすると、垂直/水平線は、幅/高さが0のLabelコントロールに置き換わります。また、斜めのLineコントロールは、同じ幅と高さを持つ赤色のラベルに変わります(図10)。
そして、このとき、アップグレードレポート(_UpgradeReport.htm)がプロジェクトに追加されます(図11)。アップグレードレポートには、アップグレードに関する全般的な情報や、アップグレードされたもの、されなかったものとその重大度レベル、さらに、適切にアップグレードするためになにをすればよいのか? などのアドバイスが提示されます。また、ここに表示されるオンラインヘルプへのリンクをクリックして、より詳細なヘルプを表示することもできます。
これらのサポートにより、スムーズにコードを編集することができます。

図10:LineコントロールはLabelコントロールに

コード中に、次のようなアップグレードコメントが挿入される場合もあります。コメントには、重大度レベルや、アドバイス、オンラインヘルプへのリンク情報が含まれます。

'UPGRADE_ISSUE: LineプロパティLine1.BorderWidthはランタイムでサポートされません。詳細については、ms-help://MS.MSDNVS/vbcon/html/vbup2066.htmをクリックしてください。

アップグレードコメントの重大度レベルは4通りあります。以下にそれらコメントを重大度の高い順に示します。「」内は、アップグレードレポート上に表示されるタイトルです。

【UPGRADE_ISSUE】「コンパイルエラー」

・修正が必要であり、このままではコンパイルエラーになるような致命的なコード
(例)LSet x = y

【UPGRADE_TODO】「ToDo」

・仕上げが必要なコード
(例)APIにマーシャリングする属性を追加する必要があるコード

【UPGRADE_WARNING】「実行時の警告」

・必要に応じて、コードを変更するとよいコード
(例)「Dim a(10 to 20) As String」が「Dim a(20) As String」に変更されたとき(このまま
では、無駄が生じそうだというとき)

【UPGRADE_NOTE】

・変更が必要かどうかを検討すべきコード(レポートには表示されない)
(例)レガシー機能を利用していたが適切に対応するものにアップグレードできたとき

タスクリストで「コメントを表示する」に設定すると上記のコメントがタスクリストに表示されます。
なお、デザインエラーのように、アップグレードレポートにのみ表示され、コメントとしては追加されないものもあります。
以上のようなさまざまなツールが、Visual Basic 6.0からVisual Basic .NETへのスムーズな移行作業をサポートしてくれます。

図11:アップグレードレポートがプロジェクトに追加される

コメント