Visual Basic .NET へのアップグレードを円滑に行うための Visual Basic 6.0 アプリケーションの準備

Microsoft Corporation

October 2000

要約: このドキュメントでは、アプリケーションの Visual Basic .NET へのアップグレードを計画している Microsoft Visual Basic プログラマを対象に、いくつかのヒント情報を提供します。Visual Basic .NET Upgrade Tool に関する情報を提供し、Visual Basic 6 から Visual Basic .NET へのスムーズなアップグレードを可能にするアーキテクチャ関連のガイドラインも含まれています。

目次

概要
Visual Basic .NET とは?
Visual Basic .NET が 100% 互換でない理由
Visual Basic .NET へのアップグレード
Visual Basic 6.0 と Visual Basic .NET の両方を使用する方法
アーキテクチャ関連のヒント
   ブラウザ ベース アプリケーション
   クライアント サーバー プロジェクト
   単一層アプリケーション
   データ
アップグレード
   Variant から Object へ
   Integer から Short へ
   プロパティ構文
   Visual Basic フォームから Windows Forms へ
   インターフェイス
アップグレード レポートとコメント
プログラミング関連のヒント
   事前バインドを使用する
   日付の格納に Date を使用する
   パラメータのない デフォルトプロパティを解決する
   AND/OR/NOT 文でブール値比較を使用する
   Null の伝播を避ける
   ゼロを下限とする配列を使用する
   リテラル値の代わりに定数を使用する
   ユーザー定義型の中の配列と固定長文字列
   レガシー機能の使用を避ける
   Windows API
   フォームとコントロールに関する注意事項

概要

このドキュメントでは、アプリケーションの Visual Basic .NET へのアップグレードを計画している Microsoft® Visual Basic® プログラマを対象に、いくつかのヒント情報を提供します。

Visual Basic .NET では、Visual Basic 6.0 プロジェクトを開くことで、Visual Basic .NET テクノロジにアップグレードすることができますが、ほとんどの場合、プロジェクトを Visual Basic .NET に読み込んだ後に何らかの変更を加えなくてはなりません。このドキュメントの目的は、Visual Basic .NET にアップグレードする際に必要となる変更を最小限に抑えるために、現在の Visual Basic プロジェクトをどのように設計、インプリメントすればよいかについてヒント情報を提供することです。このドキュメントは、必要に応じて新しい言語を使用し ていますが、Visual Basic .NET 言語のリファレンスとして書かれているわけではありません。

注: Visual Basic .NET は現在も開発作業が進められており、互換性に関するいくつかの細かい点は、プロダクトのリリースまでに変更される可能性があります。このドキュメントのガ イドラインに従っていても、コードの変更が不要になることが保証されるわけではありません。これらのガイドラインは、変換の際に必要となる作業の量を減ら すことを目的としています。

Visual Basic .NET とは?

Visual Basic .NET は次期バージョンの Visual Basic です。Microsoft は、単に Visual Basic 6.0 に新しい機能を追加するのではなく、製品の完全な再設計を行って、Web システムやエンタープライズ向け n 層システムなどの分散型アプリケーションをこれまで以上に簡単に開発できるようにしました。Visual Basic .NET には、2 つの新しいフォーム パッケージ (Windows Forms と Web Forms)、オフライン状態のデータ ソースにアクセスするための新しいバージョンの ADO、および、レガシー キーワードが削除され、タイプ セイフティが改善され、熟練した開発者に必要な低水準コンストラクトを公開する合理化された言語が用意されています。

これらの新機能は、Visual Basic 開発者に新しい世界を提供します。Web Forms と ADO .NET により、スケーラブルな Web サイトを短期間で開発することができます。言語には継承機能が追加され、真のオブジェクト指向プログラミングがサポートされています。Windows Forms はアクセシビリティとビジュアル継承をネイティブにサポートします。そして、アプリケーションの導入は、実行可能ファイルとコンポーネントをディレクトリ 間でコピーするだけで簡単に行うことができます。

Visual Basic .NET は、他の Microsoft Visual Studio .NET 言語(.NET Framework上で動作するプログラミング言語)と完全に統合されています。アプリケーション コンポーネントを異なるプログラミング言語で開発できるだけでなく、異なるプログラミング言語間の継承機能を使って、他の言語で書かれたクラスを継承する こともできます。統合されたデバッガにより、ローカルに実行されているか、リモート コンピュータ上で実行されているかにかかわらず、複数の言語で書かれたアプリケーションをデバッグすることができます。どの言語を使用する場合でも、 Microsoft .NET Framework は Microsoft Windows® とインターネットを利用するための豊かなクラスのセットを提供します。

Visual Basic .NET が 100% 互換でない理由

Visual Basic .NET の設計を始めるにあたって、2 つの選択肢がありました。既存のコード ベースを手直しして.NET Framework で動作するように変更するアプローチと、プラットフォームをフルに活用するためにゼロから作り直すというアプローチです。最終的には、カスタマの多くが求 めている機能 (継承、スレッディングなど) を提供し、プラットフォームへの制約のないアクセスを提供し、Visual Basic を次世代の Web アプリケーションの世界に対応させるために、新しいプラットフォーム上でゼロから作り直すという決定が下されました。

たとえば、Windows Forms に含まれている新機能の多くは、既存のコードをベースにして新しいコントロールやプロパティとして追加しても実現できていたはずです。しかし、このアプ ローチをとっていれば、セキュリティやビジュアル継承といった Windows Forms の他の優れた機能は実現できなかったでしょう。

開発チームの主な目標の 1 つは、Visual Basic のコードに、Microsoft Visual C#TM や Microsoft Visual C++® などの他の言語で書かれたコードとの完全な相互運用性を持たせ、Visual Basic 開発者が、これまでのような Windows API によるプログラミングを行わなくても、.NET Framework のパワーを簡単に引き出せるようにすることでした。新しい Visual Basic は、Visual C++ や、共通言語ランタイム(Common Language Runtime)をターゲットとする他の言語と同じ変数型、配列、ユーザー定義型、クラス、およびインターフェイスを備えています。その代わりに、固定長 文字列やゼロ以外の値を下限とする配列といったいくつかの機能は言語から削除せざるをえませんでした。

Visual Basic は真のオブジェクト指向言語になりました。GoSub/ReturnDefInt などのわかりにくく一貫性のない一部の機能が、言語から削除されています。

このように新しく作り直された Visual Basic は、今後も Windows ベース アプリケーションを作成するための最も生産性の高いツールとして、また次世代の Web アプリケーションを作成するための最適なツールとして位置づけられることになります。

Visual Basic .NET へのアップグレード

Visual Basic .NET は、従来の Windows 開発から次世代の Web および n 層アプリケーションの構築へと、根本的なシフトを可能にします。このため、アプリケーションのコードを Visual Basic .NET を利用できるようにアップグレードする必要があります。

このアップグレードは、Visual Basic .NET で Visual Basic 6.0 プロジェクトを開いたときに自動的に行われます。Upgrade Wizard がアップグレード プロセスをガイドし、新しい Visual Basic .NET プロジェクトを作成します (既存のプロジェクトはそのまま残されます)。これは 1 方向のプロセスであり、新しく作成された Visual Basic .NET プロジェクトを Visual Basic 6.0 で開くことはできません。

プロジェクトのアップグレードの際には、言語上の構文の違いにあわせて変更され、Visual Basic 6.0 のフォームは Windows Forms に変換されます。ほとんどの場合、アップグレードが終わった後に、コードに何らかの変更を加えなくてはなりません。これは、一部のオブジェクトと言語機能 について、Visual Basic .NET に等価な要素が存在しないか、両者の違いが大きすぎ、自動アップグレードに適しないからです。また、アップグレード後に、Visual Basic .NET の新機能を利用するためにアプリケーションを変更することもできます。

たとえば、Windows Forms はコントロールのアンカー機能をサポートしているので、古い Visual Basic 6.0 フォームのサイズ変更コードの大部分は削除することができます。

Aa260644.vb6tovbdotnetfig11(ja-jp,VS.60).gif
図 1. VB.NET がサポートするコントロールのアンカー機能 (画像をクリックすると大きな画像が表示されます)

コードの変更を支援するために、プロジェクトのアップグレードが終了すると、Visual Basic .NET は問題点を列挙した「アップグレード レポート」をプロジェクトに追加し、アップグレード後のコードに、変更する必要がある文を指摘するコメントを挿入します。これらのコメントは新しい [Task List] ウィンドウに 'TO DO' タスクとして表示されるので、どのような変更が必要なのかを簡単に把握でき、タスクをダブルクリックするだけでコードにナビゲートすることができます。 アップグレード レポートの中の個々のタスクと項目はオンライン ヘルプのトピックに関連付けられており、なぜコードの変更が必要なのか、またそのためには何をすればいいのかが簡単にわかるしくみになっています。

このドキュメントのヒントに従うことにより、プロジェクトを Visual Basic .NET にアップグレードした後に必要となる変更を最小限に抑えることができます。ここに示しているヒントの大部分は、適切なプログラミングの例を示しているに過 ぎません。ただし、等価な機能が存在しないオブジェクトとメソッド、あるいは将来プロジェクトを Visual Basic .NET にアップグレードする予定がある場合には多用すべきでないオブジェクトとメソッドについても取り上げています。

Visual Basic 6.0 と Visual Basic .NET の両方を使用する方法

Visual Basic .NET アップグレードウィザードは Visual Basic 6.0 のプロジェクトをサポートしています。プロジェクトがVisual Basic のバージョン 1~5 で書かれている場合には、Visual Basic .NET へのアップグレードを行う前に、そのプロジェクトを (Microsoft ActiveX® コントロールへのアップグレードを選択) VB6 にロードし、コンパイル、保存しておくことをお勧めします。

Visual Basic .NET と Visual Basic 6.0 の両方を同じコンピュータにインストールし、同時に実行することができます。同じように、Visual Basic .NET で書かれたアプリケーションと Visual Basic 6.0 で書かれたアプリケーションを同じコンピュータにインストールし、同時に実行することもできます。Visual Basic .NET で書かれたコンポーネントは、以前のバージョンの Visual Basic や他の言語で書かれた COM コンポーネントと相互運用を行うことができます。たとえば、Visual Basic 6.0 で書かれた ActiveX コントロールを Visual Basic .NET の Windows Form 上で使ったり、Visual Basic 6.0 の COM オブジェクトを Visual Basic .NET のクラス ライブラリから使用したり、Visual Basic 6.0 の実行可能ファイルに Visual Basic .NET ライブラリへの参照を追加するといったことができます。

Visual Basic .NET でコンパイルされたコンポーネントと Visual Basic 6.0 でコンパイルされたコンポーネントには、実行時の動作に細かい違いがあります。第 1 に、Visual Basic .NET オブジェクトはガーベジ コレクションを通して解放されるので、オブジェクトを明示的に破棄した場合でも、それが実際にメモりから削除されるまでにはタイム ラグが生じることがあります。また、このドキュメントで後に説明するように、Variant から Object への変更などの違いもあります。これらの違いによって、Visual Basic .NET アプリケーションの実行時の動作は、Visual Basic 6.0 アプリケーションのそれと似てはいますが、完全に同じものではありません。

さらに、Visual Basic .NET は Visual Basic .NETと Visual Basic 6.0 間のコンポーネントのバイナリ互換性を不要なものにしています。コンポーネントはこれまで以上に堅牢なバージョニングおよび導入システムを持ち、ファイル はディレクトリにコピーするだけで導入することができ (RegSvr32 を使用する必要はなくなりました)、コンポーネントの新しいバージョンへのアップグレードは古いファイルを新しいファイルに置き換えるだけで簡単に行えま す。必要なのは、クラストメソッドに前のバージョンとの互換性を持たせることだけです。

アーキテクチャ関連のヒント

.NET プラットフォームはこれまでのアーキテクチャを改善し、オフライン状態のデータ アクセス、HTTP ベースのメッセージ トランスポート、およびファイル コピーによる導入 (コンポーネントの登録は不要) などを通して、アプリケーションのスケーラビリティと分散性のサポートを強化しています。これらの機能を完全に利用するためには、アプリケーションの設計 にあたって、Visual Basic .NET アプリケーションのアーキテクチャを考慮する必要があります。

ブラウザ ベース アプリケーション

Visual Basic 6.0 と Microsoft Visual Studio® 6.0 は、ブラウザ ベースのインターネットおよびイントラネット アプリケーションを作成するためのテクノロジをいくつか提供していました。

  • Web クラス
  • DHTML プロジェクト
  • ActiveX ドキュメント
  • Active Server Pages (ASP)

Visual Basic .NET には ASP の強化バージョンである ASP.NET が追加されており、アーキテクチャには Web Forms (Visual Basicのようなイベントを含んだ HTML ページ) が追加されています。つまりサーバー ベースのアーキテクチャになっています。

以下に、Visual Basic .NET プロジェクトへのシームレスな移行が可能な Visual Basic 6.0 のブラウザ ベース アプリケーションを開発するための方法とアーキテクチャ関連のヒントを示します。

  • アプリケーションの作成には、Microsoftの多層アーキテクチャのガイドラインを使用し、インターフェイスは ASP で作成し、ビジネス ロジックには Visual Basic 6.0 または Visual C++ 6.0 の COM オブジェクトを使用することをお勧めします。ASP は Visual Basic .NET で完全にサポートされており、ASP、ASP.NET、および Web Forms を使って、将来もアプリケーションを拡張することができます。Visual Basic 6.0 と Visual C++ 6.0 のビジネス オブジェクトは、変更なしで使用することも、Visual Studio .NET にアップグレードすることもできます。
  • DHTML アプリケーションは、DHTML ページとクライアント サイド DLL を含んでいます。これらのアプリケーションは Visual Basic .NET に自動的にアップグレードすることはできません。これらのアプリケーションは Visual Basic 6.0 のまま使用することをお勧めします。
  • ActiveX ドキュメントは Visual Basic .NET でサポートされていないため、DHTML プロジェクトと同様に自動的にアップグレードすることはできません。ActiveX ドキュメント アプリケーションは Visual Basic 6.0 のままにしておくか、可能であれば ActiveX ドキュメントをユーザー コントロールに置き換えることをお勧めします。
  • Visual Basic 6.0 ActiveX ドキュメントと DHTML アプリケーションは Visual Basic .NET テクノロジと相互運用を行うことができます。たとえば、Visual Basic .NET Web Form と Visual Basic 6.0 DHTML ページの間でナビゲートすることができます。
  • Web クラスは Visual Basic .NET には存在しません。Web クラス アプリケーションは ASP.NET にアップグレードされます。ただし、アップグレード後にいくつかの変更を必要とします。既存の Web クラス アプリケーションでも Visual Basic .NET の Web Forms および ASP アプリケーションと相互運用を行うことができますが、プロジェクトを新規に作成する場合には、Windows DNA プラットフォームの ASP と Visual Basic 6.0 のビジネス オブジェクトを使用することをお勧めします。

Microsoftの多層アーキテクチャを使ったアプリケーションの構築の詳細については、Microsoft Windows DNA Web サイト (英語) を参照してください。

クライアント サーバー プロジェクト

Visual Basic 6.0 には、クライアント サーバー アプリケーションを作成するためのいくつかのテクノロジが用意されていました。

  • Visual Basic フォーム
  • Microsoft Transaction Server (MTS)/COM+ 中間層オブジェクト
  • ユーザー コントロール

Visual Basic .NET には、Windows Forms という新しいフォーム パッケージがあります。Windows Forms は Visual Basic 6.0 のフォームとは異なるオブジェクト モデルを持っていますが、多くの点で互換性があります。プロジェクトをアップグレードすると、Visual Basic フォームは Windows Forms に変換されます。

Visual Basic .NET では、中間層の MTS および COM+ コンポーネント サービス コンポーネントの開発サポートが改善されています。統合されたデバッガにより、クライアント アプリケーションから MTS/COM+ コンポーネントにステップインし、再びクライアントに戻ることができます。また統合されたデバッガを使って、Visual Basic 6.0 MTS/COM+ コンポーネントをステップ スルーすることもできます (シンボリック デバッグ情報を付けて、最適化なしでネイティブ コードにコンパイルされている必要があります)。

また、Visual Basic .NET では中間層コンポーネントとして Web サービスを使うことができます。Webサービス は ASP.NET によってホスティングされ、HTTP トランスポートを使用しているため、メソッド要求をファイヤウォールを通して送信することができます。また、データの受け渡しには、業界標準の XML が使われているため、他の言語や他のプラットフォームからも Webサービス の機能にアクセスすることができます。MTS トランザクションはサポートされませんが、分散トランザクションの必要がなく、他のプラットフォームとの相互運用が必要なケースでは、MTS/COM+ コンポーネントを Webサービス に変更するとよいでしょう。変更は自動的には行われませんが、プロジェクトを Visual Basic .NET にアップグレードした後に、ドラッグ アンド ドロップ操作を使って簡単に変更することができます。

プロジェクトがアップグレードされると、ユーザー コントロールは Windows コントロールにアップグレードされます。ただし、カスタム プロパティ タグの設定とアクセラレータ キーの割り当てはアップグレードされません。

単一層アプリケーション

Visual Basic 6.0 は、いくつかのタイプの単一層アプリケーションの構築をサポートしていました。

  • 単一層データベース アプリケーション
  • Visual Basic アドイン
  • ユーティリティ プログラムとゲーム

単一層データベース アプリケーションの典型的な例は、Microsoft Access データベースにデータを格納する Visual Basic アプリケーションです。これらのアプリケーションは、いくつか制限は付きますが、Visual Basic .NET にアップグレードすることができます (このドキュメントの「データ」のセクションを参照してください)。

Visual Basic .NET の統合開発環境 は Visual Studio .NET統合開発環境に完全に統合されていることから当然のことですが、Visual Basic .NET には新しい言語中立的な拡張性モデルが組み込まれています。Visual Basic .NET アドインは Visual Studio .NET アドインとなっており、Visual Studio .NET の任意の言語を自動化したり、機能を追加することができます。たとえば、Visual C# の Windows Forms の色を変更したり、Visual Basic クラスにコメントを追加する Visual Basic .NET アドインを作成することができます。この機能を提供するために、Visual Basic .NET は以前の拡張モデルを廃止しており、新しい機能を利用するためにはアプリケーション内の拡張オブジェクトを変更する必要があります。

多くのアプリケーションはユーティリティ プログラムのカテゴリに分類されます。ファイルやレジストリ項目などを操作するユーティリティ アプリケーションは、一般に何の変更を行わなくてもアップグレードされます。アップグレードが終わったら、ファイル システム エラーをキャプチャする言語内の例外処理や、レジストリを操作するための.NET Framework レジストリ クラスの使用など、さまざまな新機能を利用することができます。注意しなくてはならないのは、シューティング ゲームのように Visual Basic 6.0 の具体的なパフォーマンス特性に依存しているアプリケーションは、Visual Basic .NET のパフォーマンス特性との違いのせいで、何らかの変更を必要とする可能性が高いということです。Visual Basic .NET のゲーム サポートについては、Microsoft DirectX® 7 か、GDI+と呼ばれる新しいバージョンの GDI を使用することができます。GDI+ には、すべての 2-D グラフィックス プリミティブのアルファ ブレンディング サポート、アンチエイリアシング、および画像ファイル形式のサポートの強化を含むさまざまな新機能が追加されています。

データ

Visual Basic 6.0 は、いくつかのタイプのデータ アクセスをサポートしていました。

  • ActiveX Data Objects (ADO)
  • Remote Data Objects (RDO)
  • Data Access Objects (DAO)

Visual Basic .NET には、ADO .NET という名前の ADO の拡張バージョンが追加されています。ADO .NET はオフライン状態のデータをターゲットとしており、分散型アプリケーションで使用したときのパフォーマンスが ADO と比べて改善されています。ADO .NET は、Windows Forms に対してはコントロールへの読み書き可能データ バインディングを、Web Forms に対しては読み取り専用データ バインディングをサポートします。

DAO、RDO、および ADO は、小さな変更を加えるだけで Visual Basic .NET のコードでも継続して使用することができます (変更点については、このドキュメントの言語のセクションで説明しています)。ただし、Visual Basic .NET は、コントロール、データ コントロール、または RDO User 接続への DAO および RDO データ バインディングはサポートしていません。DAO または RDO データ バインディングを使っているアプリケーションは、Visual Basic 6.0 のまま使用するか、プロジェクトを Visual Basic .NET にアップグレードする前に、DAO および RDO データ バインディングを ADO にアップグレードすることをお勧めします。ADO データ バインディングのみが Windows Forms でサポートされているからです。アップグレードの方法は、Visual Basic 6.0 のヘルプに記されています。 要約すると、Visual Basic 6.0 プロジェクトでは ADO を使用することをお勧めします。

アップグレード

コードをアップグレードする際に、Visual Basic .NET はアップグレードされた新しいプロジェクトを作成し、言語とオブジェクトに対する必要な変更の大部分を自動的に行ってくれます。以下のセクションでは、 コードがどのようにアップグレードされるかを示す例をいくつか紹介します。

Variant から Object へ

これまでのバージョンの Visual Basic は、任意のプリミティブ型 (固定長文字列を除く)、Empty、Error、Nothing、および Null を代入することができる Variant データ型をサポートしていました。Visual Basic .NET では、Variant データ型と Object データ型の機能が Object という 1 つの新しいデータ型に統合されています。Object データ型には、プリミティブ データ型、Empty、Nothing、Null、およびオブジェクトへのポインタを代入することができます。

プロジェクトが Visual Basic .NET にアップグレードされると、Variant として宣言されているすべての変数が Object に変更されます。また、コードがエディタに読み込まれると、Variant キーワードは Object に置き換えられます。

Integer から Short へ

Visual Basic 6.0 では、現在 16 ビット整数のデータ型は Short に、32 ビット整数のデータ型は Integer になっています (Long は 64 ビットです)。プロジェクトをアップグレードすると、変数の型が以下のように変更されます。

従来バージョンの Visual Basic:

Dim x As Integer dim y as Long

Visual Basic .NET にアップグレード後:

Dim x As Short dim y as Integer

プロパティ構文

Visual Basic .NET には、GetSet をまとめた、よりわかりやすいプロパティの構文が用意されています。プロパティ文は、次の例のようにアップグレードされます。

従来バージョンの Visual Basic:

Property Get MyProperty() As Integer     MyProperty = m_MyProperty End Property Property Let MyProperty(NewValue As Integer)     m_MyProperty = NewValue End Property

Visual Basic .NET にアップグレード後:

Property MyProperty() As Short     Get         MyProperty = m_MyProperty     End Get     Set         m_MyProperty = Value     End Set End Property

Visual Basic フォームから Windows Forms へ

Visual Basic .NET には、アクセシビリティをネイティブにサポートし、インプレース メニュー エディタを持つ新しいフォーム パッケージ Windows Forms が用意されています。既存の Visual Basic フォームは Windows Forms にアップグレードされます。

Aa260644.vb6tovbdotnetfig12(ja-jp,VS.60).gif
図 2. Windows Forms のインプレース メニュー エディタ (画像をクリックすると大きな画像が表示されます)

インターフェイス

これまでのバージョンの Visual Basic では、パブリック クラスのインターフェイスはつねにユーザーから隠されていました。Visual Basic .NET では、インターフェイスをコード エディタで表示し、編集することができます。プロジェクトのアップグレードの際には、パブリック クラスのインターフェイス宣言を自動的に作成させるかどうかを選択することができます。

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

プロジェクトをアップグレードすると、アップグレード後のコードに加えなくてはならない変更点を列挙したアップグレード レポートがプロジェクトに追加されます。さらに、問題が生じる可能性のある箇所を指摘するコメントがコードに追加されます。これらのコメントは、 Visual Studio .NET の Task List に自動的に表示されます。

Aa260644.vb6tovbdotnetfig13(ja-jp,VS.60).gif
図 3. アップグレード コメントは Visual Basic コードと Task List の両方に追加される (画像をクリックすると大きな画像が表示されます)

プログラミング関連のヒント

このセクションでは、プロジェクトを Visual Basic .NET にアップグレードした後に必要となる変更を最小限に抑えるためのコードの書き方について、いくつかのヒントを示します。

事前バインドを使用する

Visual Basic 6.0 と Visual Basic .NET は、どちらも遅延バインドされたオブジェクトをサポートしています。これは、変数を Object データ型として宣言し、実行時にクラスのインスタンスを代入するという方法です。しかし、遅延バインドされたオブジェクトは、アップグレード プロセスの進行中に、デフォルト プロパティを解決するときや、下位のオブジェクト モデルが変更されていて、プロパティ、メソッド、およびイベントを変換しなくてはならないような場合に問題を生じることがあります。たとえば、 Label1 という名前のラベルを含んだ Form1 というフォームがあったとします。次の Visual Basic 6.0 コードは、ラベルのキャプションを "SomeText" に設定します。

Dim o As Object Set o = Me.Label1 o.Caption = "SomeText"

Visual Basic .NET の Windows Forms では、ラベル コントロールの Caption プロパティは Text という名前になっています。コードをアップグレードすると、Caption プロパティのすべてのインスタンスが Text に変更されますが、遅延バインドされたオブジェクトは型を持たないので、Visual Basic はそのオブジェクトの型が何なのか、また変換を必要とするプロパティはあるのかどうかを知ることができません。このような場合には、アップグレードの終了 後にコードを手動で変更する必要があります。

コードを事前バインドされたオブジェクトを使って書き換えておけば、アップグレードは自動的に行われます。

Dim o As Label Set o = Me.Label1 o.Caption = "SomeText"

変数は可能な限り、Object データ型として宣言するのではなく、適切なオブジェクト型で宣言するようにしてください。

Visual Basic 6.0 のコードで Object および Variant 変数を使用している場合には、変数を代入するとき、変数に対して演算を行うとき、または変数を関数に渡すときに明示的な変換を使用することをお勧めします。たとえば、次のコードでは、'+' 演算の意図が不明確です。

Dim Var1 As Variant Dim Var2 As Variant Dim Var3 As Variant Var1 = "3" Var2 = 4 Var3 = Var1 + Var2   '悪い例: 演算の意図が不明確

Var1 と Var2 は、文字列と整数のどちらで足し合わせればよいのかわかりません。

上の例は、Visual Basic .NET ではランタイム エラーになる可能性があります。最後の行を、明示的な変換を使用するように書き換えれば、コードは正常に動作します。

Var3 = CInt(Var1) + CInt(Var2)   '良い例: 明示的な変換

Visual Basic .NET は、パラメータ型に基づく関数のオーバーロードをサポートしています。たとえば、現在の Environ 関数には次の 2 つの形式があります。

Environ( Expression As Integer) As String Environ( Expression As String ) As String

Visual Basic .NET は、パラメータ型に基づいて、どの関数を呼び出すかを決定します。Environ () に整数を渡すと整数のバージョンが呼び出され、文字列を渡すと文字列のバージョンが呼び出されます。オーバーロードされた関数に Variant または Object データ型を渡すコードは、コンパイル エラーまたはランタイム エラーになる可能性があります。次の例のように明示的な変換を使用すれば、Visual Basic .NET にアップグレードしても、コードは意図どおりに動作します。

Dim a As String Dim v As Variant v = "Path" a = Environ(CStr(v))   '良い例: 明示的な変換

遅延バインドされるオブジェクトには明示的な変換を使用することをお勧めします。これにより、コードの意図がわかりやすくなり、プロジェクトの Visual Basic .NET への移行も簡単になります。

日付の格納に Date データ型を使用する

以前のバージョンの Visual Basic では、日付の格納と操作に Double データ型を使用することができました。Visual Basic .NET では、日付は内部的に Double としては格納されないので、Double データ型を使用してはなりません。たとえば、次のコードは Visual Basic 6.0 では有効ですが、Visual Basic .NET ではコンパイル エラーになる可能性があります。

Dim dbl As Double Dim dat As Date dat = Now dbl = dat      '悪い例: Double データ型の変数に Date データ型の値を代入することはできない dbl = DateAdd("d", 1, dbl)   '悪い例: Double を日付関数で使用することはできない dat = CDate(dbl)   '悪い例: CDate は Double を Date に変換することはできない

.NET フレームワークは、Double と Date の間で変換を行うための ToOADate および FromOADate 関数を用意しています。しかし、プロジェクトを Visual Basic .NET にアップグレードする際には、日付の格納に Double を使用しているコードの意図を知ることは困難です。Visual Basic .NET のコードの不必要な変更を避けるために、日付の格納には必ず Date データ型を使用するようにしてください。

パラメータのない デフォルトプロパティを解決する

Visual Basic 6.0 では、多くのオブジェクトがデフォルト プロパティを公開しており、プログラミング上の簡略化するために省略可能となっています。たとえば、TextBox のデフォルト プロパティは Text です。

MsgBox Form1.Text1.Text

上のコードを簡略化すると次のコードになります。

MsgBox Form1.Text1

デフォルト プロパティはコードのコンパイル時に解決されます。さらに、次の例のように、遅延バインドされるオブジェクトでもデフォルト プロパティを使用することができます。

Dim obj As Object Set obj = Form1.Text1 MsgBox obj

遅延バインドの例では、デフォルト プロパティは実行時に解決され、MsgBoxTextBox のデフォルト プロパティの値として Text1 を表示します。

Visual Basic .NET はパラメータのないデフォルト プロパティをサポートしていないため、このプログラミング上の簡略化された表現は使用できません。プロジェクトのアップグレードの際に、Visual Basic .NET はのない デフォルト プロパティを解決しますが、実行時の解決に依存する遅延バインドのコードは自動的に解決することができません。このような場合には、コードを手動で変更す る必要があります。事態を複雑にするのは、多くのライブラリが _Default という名前のプロパティを使ってデフォルト プロパティをインプリメントしていることです。_Default は、呼び出しを実際のデフォルト プロパティに渡すプロキシとして機能します。このため、プロジェクトがアップグレードされると、一部のデフォルト プロパティは _Default に解決されます。この場合、コードは通常どおりに動作しますが、実際のプロパティを使って明示的に書かれたコードよりもわかりにくくなります。このような 理由により、Visual Basic 6.0 のコードでパラメータレス デフォルト プロパティを使うのは避けるようにしてください。たとえば、次のようなコードは使用するべきではありません。

Dim obj As Object Set obj = Me.Text1 MsgBox obj   '悪い例: デフォルト プロパティに依存している MsgBox Me.Text1   '悪い例: デフォルト プロパティに依存している

代わりに、次のようなコードを使用します。

Dim obj As Object Set obj = Me.Text1 MsgBox obj.Text   '良い例: デフォルト プロパティが解決されている MsgBox Me.Text1.Text   '良い例: デフォルト プロパティが解決されている

Visual Basic .NET では、パラメータなしのデフォルト プロパティはサポートされませんが、パラメータ付きのデフォルト プロパティはサポートされています。この 2 つのタイプの違いは、パラメータ付きデフォルト プロパティがつねにインデックスを持つという点にあります。例として、ADO レコードセットのデフォルト プロパティである Fields コレクションを取り上げます。

Dim rs As ADODB.Recordset rs("CompanyName") = "SomeCompany" rs!CompanyName = "SomeCompany"

このコードは、実際には次のコードの省略形です。

Dim rs As ADODB.Recordset rs.Fields("CompanyName").Value = "SomeCompany" rs.Fields!CompanyName.Value = "SomeCompany"

この例では、Fields プロパティはパラメータ化されているので、Visual Basic .NET でも有効です。ただし、Fields プロパティのデフォルト プロパティである Value はパラメータなしなので、Visual Basic .NET での正しい使い方は次のようになります。

Dim rs As ADODB.Recordset rs("CompanyName").Value = "SomeCompany" rs!CompanyName.Value = "SomeCompany"

この例と、他の大部分のデフォルト プロパティは、プロジェクトのアップグレード時に自動的に解決されるので、Visual Basic 6.0 でも解決を行っておくことがプログラミング の慣例として勧められます。ただし、Object および Variant データ型を持つデフォルト プロパティは自動的には解決されず、プロジェクトのアップグレード後に手動でコードを変更する必要があるため、できれば使わないようにしてください。

AND/OR/NOT 文でブール値比較を使用する

And および Or キーワードの動作は、Visual Basic .NET と Visual Basic 6.0 で異なります。Visual Basic 6.0 では、And キーワードは、オペランドの型に応じて論理 AND かビット AND を実行していました (True が値 -1 を持っていたため)。Visual Basic .NET では、AND は論理 AND しか実行しません。Visual Basic .NET では、ビット演算を行うための新しい演算子のセット、BitAndBitOrBitNot、および BitXor が言語に追加されています。

次の例は、この違いの効果を示しています。

Dim a As Integer Dim b As Integer Dim c As Boolean a = 1 b = 2 c = a And b MsgBox ("The answer is " & c)

このコードを Visual Basic 6.0 で実行したときの結果は False (ビット AND) となります。しかし、Visual Basic .NET での結果は True (論理 AND) です。コードがアップグレード後も同じ動作をするように、Visual Basic .NET には、AND/OR/NOT を Visual Basic 6.0 と同じ方法で (オペランドに応じて論理演算またはビット演算を選択して) 評価する互換性関数 VB6.And、VB6.Or、および VB6.Not が用意されています。上のコードはアップグレード後には次のようになります。

Dim a As Short Dim b As Short Dim c As Boolean a = 1 b = 2 c = VB6.And(a, b) MsgBox ("The answer is " & c)

アップグレード後のコードは、Visual Basic 6.0 の場合と同様に、False という結果を出します。

コードが互換性関数にアップグレードされるのを防ぐためには、AND/OR/NOT 文でブール値比較を使用するようにしてください。たとえば、上の例を次のように変更したとします。

Dim a As Integer Dim b As Integer Dim c As Boolean a = 1 b = 2 c = a <> 0 And b <> 0 MsgBox ("The answer is " & c)

プロジェクトのアップグレード後のコードは、よりわかりやすくなります。

Dim a As Short Dim b As Short Dim c As Boolean a = 1 b = 2 c = a <> 0 And b <> 0 MsgBox ("The answer is " & c)

個々の演算子がブール式の中で比較されているため、Visual Basic 6.0 では論理 AND が使用されます。論理 AND は Visual Basic 6.0 と Visual Basic .NET で同じ結果を生成するので、コードは変更されません。これにより、Visual Basic .NET と Visual Basic 6.0 の間でコードのカット アンド ペーストを行わずに済むだけでなく、Visual Basic .NET が互換性関数の代わりにネイティブな AND 演算子を使用するので、コードの速度が向上します。

Visual Basic .NET は、AND/OR/NOT 演算の中の関数を、Visual Basic 6.0 とは異なる方法で処理します。次の例を考えてみましょう。

Dim b As Boolean b = Function1() And Function2()

Visual Basic 6.0 では、Function1Function2 の両方が評価されます。Visual Basic .NET では、Function2Function1True を返した場合にのみ評価されます。これは論理演算子のショート サーキットと呼ばれます。通常、この違いは、実行時にショート サーキットのバージョンの方が高速に動作するという違いでしかありません。しかし、Function2 にデータベースやグローバル変数の操作などを含んでいる場合には、文の実行時の動作が Visual Basic 6.0 から変わってしまいます。この問題を避けるために、AND/OR/NOT 文が関数、メソッド、またはプロパティを含んでいる場合、その文は関数の評価を行う互換性バージョンにアップグレードされるようになっています。上の例の場合は次のようにアップグレードされます。

Dim b As Boolean b = VB6.AND(Function1(), Function2())

コードが互換性バージョンにアップグレードされるのを避けるには、次のような変更を加えます。

Dim b As Boolean Dim c As Boolean Dim d As Boolean c = Function1() d = Function2() b = c And d

また、Visual Basic .NET では、True の下位の値が -1 から 1 に変更されていることに注意してください。この変更は Visual Basic アプリケーションと他の.NET プログラミング言語との相互運用を可能にするために行われるもので、この変更によって Visual C++ との大きな違いがようやく解消されることになります。このような変更が加えられているので、Visual Basic 6.0 アプリケーションでは、必ず -1 の代わりに定数 True を使用し、ブール値を保持する目的には整数ではなくブール型を使用するようにしてください。このことの重要性は、Visual Basic 6.0 では True、Visual Basic .NET では False の結果を出す次の例からわかるでしょう。

Dim i As Integer i = True If i = -1 Then     MsgBox ("True") Else     MsgBox ("False") End If

Boolean を使用するように変更することで、Visual Basic 6.0 と Visual Basic .NET の両方で True の結果が返され、コードも読みやすくなります。

Dim i As Boolean i = True If i = True Then     MsgBox ("True") Else     MsgBox ("False") End If

この例の最も重要な教訓は、次の 2 つです。

  • 0 と -1 の代わりに、必ず定数名 TrueFalse を使用する。
  • Boolean の値を格納する目的には Boolean型を使用する。

この 2 つの項目を守らなかった場合、プロジェクトを Visual Basic .NET にアップグレードした後で、多くの変更を余儀なくされる可能性があります。

Null の伝播を避ける

これまでのバージョンの Visual Basic は Null の伝播をサポートしていました。Null の伝播は、式の中で Null が使用されると、式の結果そのものも Null になるということを保証します。次に示す例では、V の結果はいずれも Null です。

Dim V V = 1 + Null V = Null + Right$("SomeText", 1) V = Right("SomeText", 0)

Null の伝播は Visual Basic .NET ではサポートされていません。1 + Null という文は、Visual Basic .NET では型の不一致となります。さらに、Visual Basic 6.0 では Left 関数に、文字列を返す Left$ と、Null を許容するバリアントを返す Left の 2 つのバージョンがありましたが、Visual Basic .NET にはつねに文字列を返す Left の 1 バージョンしかありません。

Visual Basic 6.0 と Visual Basic .NET の両方で互換性を確保するためには、Null の伝播に依存するのではなく、つねに Null のテストを行うコードを書くようにしてください。また、以下の関数は、Visual Basic .NET では Null を返さなくなっています。

Chr Mid
Command Oct
CurDir Right
Date RTrim
Environ Space
Error Str
Hex Time
LCase Trim
LTrim UCase

Null の伝播は、データベース フィールドが Null を含んでいるかどうかのチェックを必要とするデータベース アプリケーションでよく使われます。このような場合には、IsNull () 関数を使って結果をチェックし、適切なアクションを実行するようにしてください。

ゼロを下限とする配列を使用する

Visual Basic 6.0 では、任意の整数値の下限と上限を持つ配列を定義することができました。また、ReDim を使って、バリアントを配列として再代入することができました。Visual Basic .NET では、他の言語との相互運用を可能にするために、配列は下限がゼロでなくてはなりません。また、ReDim は、変数が以前に Dim As Array で宣言されていない限り使用できなくなっています。これにより、配列の定義方法にいくつかの制約が生じますが、Visual Basic .NET と他の任意の.NET プログラミング言語との間で配列を受け渡せるようになります。これらの新しい制約を次の例に示します。

Dim a(1 To 10) As Integer   '悪い例: LBound は 0 でなくてはならない Dim v ReDim v(10)   '悪い例: Dim なしで ReDim を使用することはできない Dim b(10) As Integer   '良い例: 10 個の整数を含んだ配列を作成する ReDim b(5) As Integer   '良い例: 以前に Dim で宣言した変数には ReDim を適用できる

さらに、Visual Basic 6.0 では、Dim (10) As Integer は 0 から 10 までのインデックスを持つ 11 個の整数を含んだ配列を作成していました。Visual Basic .NET では、同じ文で、0~9 の 10 個の整数を含んだ配列が作成されます。

副作用として、言語から Option Base 0|1 が削除されています。

プロジェクトが Visual Basic .NET にアップグレードされると、すべての Option Base 文がコードから削除されます。ゼロを下限とする配列は変更されません。しかし、ゼロ以外の値を下限とする配列は、次の例のように配列ラッパー クラスにアップグレードされます。

Dim a(1 To 10) As Integer

これは次のように変更されます。

Dim a As Object = New VB6.Array(GetType(Short), 1,10)

配列ラッパー クラスはネイティブな配列よりもはるかに低速で、同じアプリケーションの中で 2 つの配列型を使用するときにいくつかの制限が課せられます。たとえば、ラッパー配列は、Array 型のパラメータを取る一部の関数に渡すことも、Visual C# または Visual C++ クラスに渡すこともでません。

このような理由から、Visual Basic 6.0 コードではゼロを下限とする配列を使用するようにし、配列宣言として ReDim を使用することや、Option Base 1 の使用は避けるようにしてください。

リテラル値の代わりに定数を使用する

コードを書くときには、リテラル値を直接記述するのではなく、定数そのものを使用するようにしてください。たとえば、フォームを実行時に最大化するには、次のコードを使用します。

Me.WindowState = vbMaximized   '良い例: 定数名

次のコードの使用は避けてください。

Me.WindowStyle = 2   '悪い例: リテラル値 Me.WindowStyle = X   '悪い例: 変数

同じように、-1 と 0 の代わりに TrueFalse を使用するようにします。

Visual Basic .NET では、一部のプロパティと定数の値が (ときにはその名前が) 変更されています。たとえば、True の値は -1 から 1 に変更されました。プロジェクトを Visual Basic .NET にアップグレードする際には、ほとんどの定数が自動的に変更されます。しかし、定数名の代わりにリテラル値や変数を使用していると、多くの場合自動的な アップグレードは行われません。定数名を使用することにより、手動で行わなくてはならない変更の数を最小限に抑えることができます。

ユーザー定義型の中の配列と固定長文字列

Visual Basic .NET の配列と構造体に他の Visual Studio .NET 言語との完全な互換性を持たせるために、固定長文字列はサポートされなくなりました。固定長文字列の動作を提供する互換性クラスが用意されているので、こ のことで問題が生じることはほとんどありません。例として、次のコードがあったとします。

Dim MyFixedLengthString As String * 100

これは次のコードにアップグレードされます。

Dim MyFixedLengthString As New VB6.FixedLengthString(100)

ここで、固定長文字列が構造体 (ユーザー定義型とも呼ばれます) の中で使用されていると、問題が生じます。これは、ユーザー定義型の作成時に固定長文字列クラスが自動的に作成されないためです。また、ユーザー定義型の 作成時に固定長配列が作成されないことから別の問題も生じます。

コードがアップグレードされるとき、固定長の文字列または配列を含んだユーザー定義型には、ユーザー定義型を使用する前 に固定長の文字列または配列を初期化するように指示するコメントが付けられます。ただし、固定長文字列の代わりに文字列を、固定サイズ配列の代わりに初期 化されていない配列を使用するように、Visual Basic 6.0 のユーザー定義型を変更しておけば、アップグレード後にコードを変更する必要はなくなります。次に例を示します。

Private Type MyType     MyArray(5) As Integer     MyFixedString As String * 100 End Type Sub Bar()     Dim MyVariable As MyType End Sub

このコードは次のように変更できます。

Private Type MyType     MyArray() As Integer     MyFixedString As String End Type Sub Bar()     Dim MyVariable As MyType     ReDim MyVariable.MyArray(5) As Integer     MyVariable.MyFixedString = String$(100, " ") End Sub

レガシー機能の使用を避ける

以下のキーワードは言語仕様から削除されるため、使用を避けるようにしてください。

  • Def<type>
  • 計算された結果に依存する GoTo/GoSub
  • GoSub/Return
  • Option Base 0|1
  • VarPtr、ObjPtr、StrPtr
  • LSet

以下では、これらのキーワードについて詳しく説明します。

Def<type>
これまでのバージョンの Visual Basic では、DefBool、DefByte、DefInt、DefLng、DefCur、DefSng、DefDbl、DefDec、DefDate、 DefStr、DefObj、および DefVar は、モジュールの中の宣言セクションで、変数の範囲を特定の型として定義するために使用されていました。次に例を示します。

DefInt A-C

これは、文字 A、B、または C で始まるすべての変数を整数として定義するものです。このような Def 文を使うのは避け、変数を明示的に宣言するようにしてください。

計算された結果に依存する GoTo/GoSub
計算された結果によって実行された GoTo/GoSub 文は次の形式を持ちます。

On x GoTo 100, 200, 300

これらの文は Visual Basic .NET ではサポートされていません。代わりに、If 文と Select Case 構文を使用するようにしてください。

GoSub/Return
GoSub および Return 文は Visual Basic .NET ではサポートされていません。ほとんどの場合、これらの文は関数とプロシージャに置き換えることができます。

Option Base 0|1
Option Base 0|1 は、配列のデフォルトの下限を指定するために使用されていました。前に述べたように、Visual Basic .NET はネイティブではゼロを下限とする配列しかサポートしないので、この文は言語から削除されています。ゼロ以外の値を下限とする配列は、ラッパー クラスを通してサポートされます。

VarPtr、ObjPtr、StrPtr
VarPtr、VarPrtArray、VarPtrStringArray、ObjPtr、および StrPtr は、変数の下位のメモリ アドレスを取得するために使われる、ドキュメント化されていない関数でした。これらの関数は Visual Basic .NET ではサポートされていません。

LSet
Visual Basic 6.0 では、LSet 文を使って、あるユーザー定義型の変数を別のユーザー定義型の変数に代入することができました。この機能は Visual Basic .NET ではサポートされていません。

Windows API

多くの API は Visual Basic 6.0 とまったく同じように使用できますが、データ型を適切に調整する必要があります。Visual Basic 6.0 の Long データ型は Visual Basic .NET の Integer データ型に変更され、Visual Basic 6.0 の Integer データ型は Visual Basic .NET の Short データ型に変更されています。アップグレードの際には、これらの変更が自動的に行われ、単純な API は Visual Basic 6.0 とまったく同じように動作します。次に例を示します。

Private Declare Function GetVersion Lib "kernel32" () As Long Function GetVer()     Dim Ver As Long     Ver = GetVersion()     MsgBox ("System Version is " & Ver) End Function

これは次のように変更されます。

Private Declare Function GetVersion Lib "kernel32" () As Integer Function GetVer()     Dim Ver As Integer     Ver = GetVersion()     MsgBox("System Version is " & Ver) End Function

数値データ型のアップグレードに加えて、Visual Basic .NET ではサポートされていない Visual Basic 6.0 の固定長文字列データ型も固定長文字列ラッパー クラスにアップグレードされます。多くの場合、Visual Basic 6.0 では、同じアクションを通常の文字列を使って実行することができます。次に例を示します。

Private Declare Function GetUserName Lib "advapi32.dll" Alias _ "GetUserNameA" (ByVal lpBuffer As String, ByRef nSize As Long) As Long Function GetUser()     Dim Ret As Long     Dim UserName As String     Dim Buffer As String * 25     Ret = GetUserName(Buffer, 25)     UserName = Left$(Buffer, InStr(Buffer, Chr(0)) - 1)     MsgBox (UserName) End Function

これは、固定長文字列ではなく、長さが 25 に明示的に設定された通常の文字列を使って書いた方が効率的です。

    Dim Buffer As String     Buffer = String$(25, " ")

これは Visual Basic .NET では次のようにアップグレードされます。

Declare Function GetUserName Lib "advapi32.dll" Alias _ "GetUserNameA" (ByVal lpBuffer As String, ByRef nSize As Integer) As Integer Function GetUser()     Dim Ret As Integer     Dim UserName As String     Dim Buffer As String     Buffer = New String(CChar(" "), 25)     Ret = GetUserName(Buffer, 25)     UserName = Left(Buffer, InStr(Buffer, Chr(0)) - 1)     MsgBox(UserName) End Function

場合によっては、Visual Basic .NET の方が API への文字列の受け渡しを簡単に行えます。ANSI および UNICODE キーワードを使って、文字列をどのコードで渡すかをオプションとして宣言することができるからです。

変更を加えなくてはならない場面は 3 つあります。第 1 の場面は、固定長文字列またはバイト列を含んでいるユーザー定義型を API に渡す場合です。Visual Basic .NET では、コードを変更し、ユーザー定義型の中の個々の固定長文字列またはバイト列に (System.Runtime.InteropServices) の MarshallAs 属性を追加しなくてはならないことがあります。第 2 の場面は、Declare 文で As Any 変数型を使用する場合です。これは Visual Basic .NET ではサポートされていません。一般に、As Any 型の変数は、文字列または Null を含む変数を渡すために使用されていました。Visual Basic 6.0 のこのようなコードは、1 つは Long を、1 つは文字列を使用する 2 つの形式の API を宣言することで置き換えることができます。たとえば、GetPrivateProfileString API は、As Any 型のパラメータ lpKeyName を持っています。

Private Declare Function GetPrivateProfileString Lib "kernel32" Alias    "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal       lpKeyName As Any, ByVal lpDefault As String, ByVal          lpReturnedString As String, ByVal nSize As Long, ByVal             lpFileName As String) As Long

この "As Any" は、Declare を 2 つのバージョンに置き換えることによって解決することができます。1 つは Long を受け取るバージョン、もう 1 つは文字列を受け取るバージョンです。

Private Declare Function GetPrivateProfileStringKey Lib "kernel32" Alias    "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal       lpKeyName As String, ByVal lpDefault As String, ByVal          lpReturnedString As String, ByVal nSize As Long, ByVal             lpFileName As String) As Long Private Declare Function GetPrivateProfileStringNullKey Lib "kernel32"    Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String,       ByVal lpKeyName As Long, ByVal lpDefault As String, ByVal          lpReturnedString As String, ByVal nSize As Long, ByVal             lpFileName As String) As Long

API に Null 値を渡したい場合は、GetPrivateProfileStringNullKey のバージョンを使用します。これにより、関数は Visual Basic .NET にアップグレードされるようになります。

変更を必要とするかもしれない最後の場面は、スレッド作成、Windows サブクラス化、メッセージ キューのフックなどの操作を実行する API を使用している場合です。これらの関数の中には、Visual Basic .NET ではランタイム エラーを発生させるものがあります。これらの API の多くは、Visual Basic .NET または.NET Framework に等価な クラス があります。これらはケース バイ ケースの判断による修正を必要とします。

フォームとコントロールに関する注意事項

Visual Basic .NET には新しいフォーム パッケージである Windows Forms が用意されています。Windows Forms は、Visual Basic 6 のフォーム パッケージとほぼ互換性を持っています。以下に、いくつかの重要な相違点を示します。

  • Windows Forms は OLE コンテナ コントロールをサポートしていません。このコントロールを Visual Basic 6.0 アプリケーションの中で使用するのは避けてください。
  • Windows Forms にはシェイプ コントロールはありません。正方形と長方形のシェイプはラベルにアップグレードされますが、楕円と円はアップグレードできません。これらのシェイプをアプリケーション内で使用するのは避けてください。
  • Windows Forms にはライン コントロールはありません。水平と垂直の線はラベルにアップグレードされますが、斜線はアップグレードされないので、使用を避けてください。
  • Windows Forms には、Form のメソッド CircleCLSPSetLine、および Point を置き換える、新しいグラフィックス コマンドのセットがあります。新しいオブジェクト モデルは Visual Basic 6.0 のものとは大きく異なるので、これらのメソッドはアップグレードされません。
  • タイマ コントロールでは、Interval プロパティを 0 に設定してもタイマは無効にならずに、間隔が 1 にリセットされます。Visual Basic 6.0 プロジェクトでは、Interval を 0 に設定する代わりに、Enabled を False に設定するようにしてください。
  • Windows Forms には MainMenu と ContextMenu の 2 つのメニュー コントロールがあるのに対して、Visual Basic 6.0 には、MainMenu または ContextMenu として開くことができる 1 つのメニュー コントロール Menu しかありません。Menu コントロールは MainMenu コントロールにアップグレードされますが、それらを ContextMenus として使用することはできません。ContextMenus は作り直す必要があります。
  • Windows Forms は Dynamic Data Exchange (DDE) をサポートしていません。
  • Windows Forms は Form.PrintForm メソッドをサポートしていません。
  • Windows Forms はドラッグ アンド ドロップ機能をサポートしていますが、オブジェクト モデルは Visual Basic 6.0 のものとは大きく異なります。このため、Visual Basic 6.0 のドラッグ アンド ドロップ プロパティとメソッドはアップグレードされません。
  • .NET フレームワークでは、Clipboard オブジェクト (System.WinForms.Clipboard) が改善され、Visual Basic 6.0 の Clipboard オブジェクトより多くの機能を提供し、より多くのクリップボード形式をサポートしています。ただし、オブジェクト モデル間の違いのために、クリップボード文を自動的にアップグレードすることはできません。
  • Windows Forms は、実行時のフォームとコントロールの Name プロパティはサポートしません。このため、Controls コレクションを繰り返し処理して、特定の名前を持つコントロールを探すようなコードを書いてはなりません (この機能は.NET の System.Reflection クラスによって実現できるようになっています)。
  • フォームが正しいサイズにアップグレードされるように、アプリケーション内では必ずデフォルトの ScaleMode である twips を使用するようにしてください。アップグレードの際に、Visual Basic .NET はフォーム座標を twips からピクセル数に変換します。