VB6からVB.NETへのマイグレーションは成功するか。
2015年から仕事でVB6からVB.NETへのマイグレーションを行っていました。
自分用のメモおよび、無いとは思いますがVB6からVB.NETへのマイグレーションを行う方の参考になればと思い、情報を残すことにしました。(半分愚痴です。)
結論
タイトルの「VB6からVB.NETへのマイグレーションは成功するか。」ですが、結論から言うと無理じゃないかなと思います。
必要なスキル
VB6からVB.NETへのマイグレーションを行うには以下のスキルが必要と考えています。
- VB6の言語仕様の把握。
- VB.NETの言語仕様の把握。
- Win32 APIでプログラムを作成した経験があり、Win32APIを把握していること。
- サードパーティーを使用している場合、サードパーティの製品に対する深い知識。
1.VB6の言語仕様の把握, 2.VB.NETの言語仕様の把握。
1と2が必要な理由は、そもそもVB6とVB.NETは全く異なるプログラミング言語だからです。(後述)
3.Win32 APIでプログラムを作成した経験があり、Win32APIを把握していること。
3についてはVB6でWin32APIを使用しているため、全く知らないとそもそも意味が分からないので苦労します。(できないとは言わない。)
4.サードパーティーを使用している場合、サードパーティの製品に対する深い知識。
4についてですがサードパーティの製品によってはメーカーが、VB6用製品からVB.NET用製品についての移行の仕方を書いた資料を用意しています。
ですが当然それの通りやっていればよい、という訳にはいきません。
サードパーティの製品でも大抵、VB6用とVB.NET用の製品はベースとなる考え方が異なりますし、微妙なレイアウトの調整などはどうしても必要です。
最悪なケースがVB6用の製品しかメーカーが作っておらず、そのメーカーも今は倒産している場合です。
その場合はVB6用のヘルプファイルをひっくり返すしか無いので、どうしても時間が必要です。
以上必要なスキルを上げましたが、そもそもこのスキルを持っている人がこの業界にそんなに存在するでしょうか?
VB6とVB.NETの差
VB6とVB.NETの違いで特に頭に残っていることを書きます。
- PictureBoxの非互換性。
- 配列のインデックスの違い。
- ByRef、ByValの違い。
- 描画単位の違い。
- Nothingの動作。
- 印刷の違い。
- DoEventの罠。
- ファイルアクセスの罠。
1.PictureBoxの非互換性。
1についてですが、PictureBoxは全く異なります。違いすぎて何が同じなのか分からないぐらいです。なので基本的にコンバート用のクラスを作成しないとだめです。
2.配列のインデックスの違い。
2についてですが、VB6の配列は1始まり(他も可能。)ですが、VB.NETは0始まりです。
それだけといえばそれだけですが、変換するのはなかなか大変です。
例えば一律に配列を参照、代入する際インデックスを-1したとしましょう。
ところがグローバル変数に配列のインデックスを代入しているケースは対応できません。また当然1始まりでないケースも存在するので、ある程度は目で確認しないといけません。
3.ByRef、ByValの違い。
3についてですが、VB.NETはByRef、ByVal指定を省略したときはByValですが、VB6はByRef指定になっています。これがプロパティのアクセス方法の違いによって、エラーとなります。(ReadOnlyとか)
4.描画単位の違い。
4ですが、VB6は主にTwipsです。VB.NETはPixelです。これも簡単に変更できそうですが配列と同じで、変数に値を格納したりするので、目でチェックする羽目になります。
5.Nothingの動作。
5ですが、VB6では例えばフォームにNothingを代入した後、.Showしてもエラーにはなりません。自動的にインスタンスを生成してくれます。
VB.NETではもちろんエラーになります。
6.印刷の違い。
6ですが、こちらも全く異なります。一応VB6との互換性を保ったクラスが用意されているので、VB6の印刷関連のラッパークラスを作成することになります
7.DoEventの罠。
7ですが、VB6はDoEventで非同期処理を行えました。.NETでもDoEventが存在しますが、非推奨でおまけに遅いです。置換してくれ、と言われた際には泣くことになります。
8.ファイルアクセスの罠。
8ですが、VB.NETでもVB6と互換性を保ったファイル書き込み、読み込みの機能は存在します。(WriteLineとか)
存在しますが、ネットワーク上にファイルを置いた場合極端に遅くなります。
結局ファイル書き込み、読み込みはすべて.NETのクラスで置き換えることになります。
他にもいろいろ存在しますが、とりあえずこのくらいで。
そもそもなぜ成功しないのか
いろいろ書きましたが、そもそもこれらは成功しない要因ではないと思っています。
成功しないのは、以下が原因だと思っています。
システムのメンテナンス性がないこと。
VB6からVB.NETへコンバートするのは、ある程度はMicrosoftのツールが自動的にやってくれます。しかしできたソリューションファイルを開くと大抵1000個ぐらいエラーとなっています。(表示されるのは100個程度です。)
コンパイルエラーを排除しなければ、当然コンパイルできません。
しかし1000個もあれば当然、コンパイルエラーの修正時にミスが発生します。
コンパイルエラーを排除してから、動作確認に移りますがこのときにコンパイルエラーのミスに気付ければよいのですが、なかなかそうはいきません。
気付けた場合そこから解析作業に移りますが、ソースコードが読みやすくない場合や仕様書などのドキュメントが存在しない場合、どうしても時間がかかります。
そんな感じでマイグレーションはなかなか成功しません。まあマイグレーション自体もうそんなにないと思うので、あまり参考にはならないかも。