VB Migration Partner is a tool that converts VB6 applications to VB.NET. It matches or exceeds the features of the conversion and assessment tools included in Microsoft Visual Studio 2005 or 2008, available on Microsoft’s site, or provided by other vendors, and is aimed at both the developer and the team manager that needs to plan the migration process. Release 1.0 generates both VB2005 and VB2008 applications.
VB Migration PartnerはVB6アプリケーションをVB.NETアプリケーションに変換するツールです。それは、Microsoft Visual Studio 2005または2008に同梱されていたり、Microsoftのウェブサイトから入手できたり、他社から提供されたりしている変換/評価ツール以上の機能を持っており、移行工程を計画しなければならない開発者とプロジェクトマネージャーの両者のために開発されました。リリース1.0ではVB2005とVB2008の両方のアプリケーションを生成します。
VB Migration Partner’s engine is so fast that VB6 developers can use it to see where the problematic code sections, have a draft version of the VB.NET application, and produce an estimation of the time required to complete the migration process, all in a fraction of the time needed to run the Upgrade Wizard tool included in Microsoft Visual Studio.
VB Migration Partnerのエンジンは非常に速いので、疑わしいソースコードを見つけたり、ドラフト版のVB.NETアプリケーションを作成したり、移行工程を完了するために必要な工数見積作成など、すべての作業をMicrosoft Visual Studioに含まれているUpgrade Wizardを実行する為に必要な時間の一部で行うことができます。
At the end of the migration process VB Migration Partner produces accurate reports about the problems it found together with metrics about the code being migrated. These reports include estimations of the time required to migrate the VB6 application and individual projects or classes. Reports also include sophisticated code metrics, such as total and average cyclomatic index, maximum and average depth of control structures, ratio of comments to code, in addition to a summary of all the migration issues found by the parser engine. The cost related to these metrics and issues (in terms of time and money) is fully configurable, and users can export metrics to Microsoft Excel for further analysis.
移行工程の終わりにVB Migration Partnerは移行されたソースコードに関する測定値と共に見つかった問題に関する正確なレポートを生成します。これらのレポートは、VB6アプリケーションと個々のプロジェクト、そしてクラスを移行するために必要な工数の見積も含まれます。レポートは洗練されたコードメトリクス、サイクロマティックインデックス)の総和および平均、制御構造の深さの最大と平均、コメント行の割合に加えて、解析エンジンによって発見された全てのマイグレーションの課題の要約などを含みます。これらのメトリクスと課題に関連するコスト(時間と費用)は自由に変更することができます。また、より深い分析のためにメトリクスをMicrosoft Excelにエクスポートすることができます。
VB Migration Partner owes its high success ratio to its two main components: (a) a better parser and code generation engine, and (b) a support library that contains both the language support library and the control support library.
VB Migration Partnerの高い変換率は二つの主要コンポーネントによるものです。すなわち、(a)高性能の解析エンジンとコード生成エンジンと、(b)言語サポートライブラリとコントロールサポートライブラリの両方を含むサポートライブラリです。
For example, VB Migration Partner’s parser is able to convert a VB6 project groups into a VB.NET solution; it can convert GoSub and On Goto/Gosub statements; Declare parameters declared with “As Any” or that stand for callback addresses; User Define Type (UDT) blocks that require initialization, auto-instancing variables and arrays, IDisposable objects, fixed-length strings, and much more.
例えば、VB Migration Partnerの解析エンジンはVB6をのプロジェクトグループをVB.NETのソリューションに変換することができます。すなわち、GoSubとOn Goto/Gosubステートメント、「As Any」で宣言された宣言パラメータやコーリバックアドレスの代わりになる宣言パラメータ、初期化が必要なユーザー定義型、自動インスタンシング変数と配列、IDisposableオブジェクト、固定長文字列、それ他多くのステートメントを変換することができます。
For converted VB.NET applications to run correctly it is mandatory that the support library be distributed with the other executable files. While a few developers might dislike the approach based on the support library, it can be easily proved that only this approach can offer full compatibility with VB6 peculiarities and idiosyncrasies.
変換したVB.NETアプリケーションを正しく実行するためには他の実行可能ファイルと共に配布されたサポートライブラリが必須となります。サポートライブラリに基づくアプローチを嫌う少数の開発者もいますが、このアプローチのみがVB6の独自性と特異性との完全な互換性を提供できることは簡単に証明することができます。
Code Architects plans to release more efficient and robust versions of the support library over time. When a new version of the support library is released, existing VB.NET applications that use the support library can be upgraded by simply deploying the new version on the end user’s computer, without having to re-run VB Migration Partner.
コードアーキテクツ社は今後、より効率的かつ堅牢なサポートライブラリをリリースする予定です。新しいバージョンのサポートライブラリがリリースされた場合、VB Migration Partnerを再実行することなく、エンドユーザのコンピュータに新しいライブラリを配布するだけでサポートライブラリを使用する既存のVB.NETアプリケーションをアップグレードすることができます。
This section summarizes the main features of Code Architects’ VB Migration Partner, with emphasis on those that are unique to this product.
このセクションではコードアーキテクツ社のVB Migration Partnerの独自性を強調しつつ主要な機能を要約します。
The language support library is entirely contained in the CodeArchitects.VBLibrary.DLL file and provides support for language commands that behave differently (or are missing) in the Microsoft.VisualBasic.dll file that comes with VB2005. All the objects and methods implemented in this support library have a trailing “6” appended to the original VB6 name, as in DoEvents6 or App6.
言語サポートライブラリは完全にCodeArchitects.VBLibrary.Dllに含まれています。 そして、VisualStudio2005に配付されているMicrosoft.VisualBasic.Dllにあるものとは異 なる動作もしくはまったくない言語の命令のサポートを提供します。全てのオブジェクト とメソッドはオリジナルVB6の名前に「6」を付与した名前でサポートライブラリに実装されてい ます。(例 App6、DoEvents6など)
For example, this VB6 code fragment:
参考例 抜粋したVB6コードより
If IsEmpty(value) Or IsNull(value) Then value = Array(1, 2, 3, 4, 5) End If
is translated to VB.NET as follows:
これをVB.NETに変換すると以下のようになります。
If IsEmpty6(value) Or IsNull6(value) Then value = Array6(1, 2, 3, 4, 5) End If
Methods that replace or extend members of the Microsoft.VisualBasic.dll library are exposed as members of the VB6Methods module, or other modules defined in the CodeArchitects.VBLibrary.dll.
Microsoft.VisualBasic.Dllの拡張されたメンバや置き換えられたメソッドはVB6メソッドモジュールまたはCodeArchitects.VBLibrary.Dllにおいて定義された他のモジュールのメンバとして引き当てられます。
These are the VB6 keywords that aren’t supported by VB.NET and that VB Migration Partner supports by means of the language support library:
以下のVB6キーワードはVB.NETではサポートされませんが、VBMigrationPartnerの言語サポートライブラリではサポートされております。
A few methods are supported by VB.NET but behave slightly differently from VB6, therefore VB Migration Partner re-implements them to ensure that no discrepancy exists:
いくつかのメソッドはVB.NETでサポートされておりますがVB6の動作とは若干異なります。VBMigrationPartnerはそれらの食い違いがないように実装されています。
The following keywords have been re-implemented to support extra features – for example, Variants and null propagation in expressions – that aren’t natively supported by VB.NET:
次のキーワードは様々な機能をサポートする為に再実装されています。例えば、バリアント型、式の中でのNull伝搬。VB.NETではそれらは基本的にサポートされていません。
The support library contains the counterpart of VB6 methods that can’t be implemented or mimicked perfectly under VB.NET. All the methods in this group are marked as Obsolete, thus they cause a warning message to be displayed in the Error List window. When invoked, these methods either do nothing or throw an exception:
サポートライブラリはVB6のメソッドに対応したものを含みます。それはVB.NET下において完全に実行できないか、まねることができません。以下のグループの全てのメソッドはサポートされないものとして明らかにされます。よって、それらはエラーリストウィンドウに警告メッセージを表示します。起動時に、これらのメソッドは何も動作しないか、例外をスローします。
The six VB6 system objects can be referenced by means of the following members:
6つのVB6システムオブジェクトは以下のメンバーの手法で参照することができます。
Note: support for the Printer6 and Printers6 objects is provided by the VBSupportLib.dll library. This DLL is a VB6 executable, therefore it requires that the VB6 runtime be installed on the target computer.
注記:Printer6とPrinters6オブジェクトのサポートはVB6SupportLib.dllライブラリで提供されています。このDllはVB6で実行可能なファイルです。よってVB6ランタイムをターゲットコンピュータにインストールする必要があります。
In addition to methods and properties, the language DLL support most of the objects defined in the VB6 runtime. All the objects in this group have a trailing “VB6” prefix, as in “VB6Variant” and “VB6PropertyBag”.
メソッドとプロパティに加えて、言語DllはVB6の定義されたほとんどのオブジェクトをサポートします。以下のグループの全てのオブジェクトは「VB6Variant」とか「VB6PropertyBag」のように「VB6」という接頭語をもっています。
A few objects have no direct counterpart in VB6:
いくつかのオブジェクトはVB6と直接対照のものがないものもあります。
Finally, the support library includes managed counterparts of the following COM objects:
最後に、サポートライブラリには以下にあるCOMオブジェクトに対応した対象物を含みます。
Here is the complete list of the 64 controls that VB Migration Partner supports:
以下にVBMigrationPartnerでサポートしている64個のコントロールを一覧します。
Form | MDIForm | UserControl |
CheckBox | ComboBox | CommandButton |
Data | DirListBox | DriveListBox |
FileListBox | Frame | HScrollBar |
Image | Label | Line |
ListBox | Menu | OptionButton |
PictureBox | Shape | TextBox |
Timer | VScrollBar |
Animation | DTPicker | FlatScrollBar |
ImageCombo | ImageList | ListView |
MonthView | ProgressBar | Slider |
StatusBar | TabStrip | Toolbar |
TreeView | UpDown |
WLCheck | WLCombo | WLCommand |
WLFrame | WLHScroll | WLList |
WLOption | WLText | WLVScroll |
ADO Data | CommonDialog | DataCombo |
DataList | MaskEdBox | PictureClip |
Remote Data | RichTextBox | SSTab |
SysInfo | WebBrowser |
INet | MAPIMessage | MAPISession |
MSComm | ScriptControl | Winsocket |
MMControl | MSCalendar (MSCAL.Calendar) | MSChart |
MSDataGrid | MSHierarchicalFlexGrid |
Notice that the list includes all the controls that are installed with Visual Basic 6, with the only exception of the OLE container control and the Repeater control. (We plan to add support for the Repeater in a future version of this support library.)
このリストはVisualBasic6にインストールされている全てのコントロールを含んでいます。例外としてはOLEコンテイナーコントロールとリピーターコントロールは含みません。(将来リリースされる予定のVersionではリピーターのサポートを追加することを検討しています。)
In general, the name of all the classes in the control support library is formed by prefixing “VB6” to the name of the original VB6 control. For example, the VB6CommandButton control renders the VB6 CommandButton control, and so on.
一般に、サポートライブラリの全てのクラスの名前は、オリジナルVB6コントロールの名前の前に「VB6」を付与した名前で生成されています。例えば、VB6CommandButtonコントロールはVB6のCommandButtonコントロールを表現しています。
In most cases, a class that replaces a VB6 control inherits from a Windows Forms control and adds or overrides members that behave exactly as they do under VB6. For example, the class that supports VB6’s TabStrip control inherits from System.Windows.Forms.TabControl. This approach ensures that the converted VB.NET application has no dependency from the original ActiveX control.
ほとんどのケースにおいて、クラスはWindowsフォームコントロールから継承したVB6コントロールを置き換えています。追加またはオーバーライドメンバーはVB6と正確な動作をします。例えば、VB6のTabStripコントロールをサポートしたクラスは、System.Windows.Forms.TabControlから継承しています。このアプローチは変換されたVB.NETアプリケーションがオリジナルActiveXコントロールからの依存をもたないということを保証します。
Only the controls that belong to the ActiveX Components and ActiveX Controls groups listed above are implemented as wrappers on the original ActiveX objects.
ActiveXコンポーネントに属すコントロールと上記にリストされたActiveXコントロールグループのみがオリジナルのActiveXオブジェクトのラッパーとして実装されています。
If the original VB6 application uses one or more controls listed in the ActiveX Components group, then the converted VB.NET project includes a reference to a TlbImp-generated DLL (for example MSCommLib for the MS Comm control). If the original VB6 application uses one or more controls listed in the ActiveX Controls group, then the converted VB.NET project includes a reference to the CodeArchitects.VBLibraryOCX.dll and CodeArchitects.AxVBLibraryOCX.dll libraries:
オリジナルVB6アプリケーションがActiveXコンポーネントグループにリストされたひとつもしくは複数のコントロールを使用する場合、変換されたVB.NETプロジェクトはTlbImpにより生成されたDLLを参照したものを含みます。(例えば、MS Comm ControlのMSCommLib)オリジナルVB6アプリケーションがActiveXコントロールグループにリストされたひとつもしくは複数のコントロールを使用する場合、変換されたVB.NETプロジェクトはCodeArchitects.VBLibraryOCX.dllとCodeArchitects.AxVBLibraryOCX.dllライブラリを参照したものを含みます。
Here is a list of relevant features that VB Migration Partner supports:
以下はVBMigrationPartnerのサポートに関連する機能一覧です。
Pragmas are special remarks that developers can add to the VB6 code to affect the behavior of the VB Migration Partner. The parser considers as a pragma any comment that starts with the “##” sequence; if the pragma name isn’t recognized, a warning appears in the Log Activity window.
開発者はVBMigrationPartnerの動作に影響を与えるようにVB6のコードを追加することができるというのがプラグマの特徴です。解析ツールはプラグマで考えられたものは「##」でつなげたコメントで始めます。もしプラグマ名が認められない場合は、警告がLog Activity Windowに表示されます。
Pragmas encourage the process we call convert-test-fix cycle. The convert-test-fix cycle is essential in converting large VB6 applications that need to be maintained or expanded until the migration process is completed and the VB.NET application is ready for the market. For large applications, in fact, the easiest way to ensure that the VB6 and VB.NET versions are always in-sync is doing as much work as possible on the original VB6 code and annotating it with pragmas. These pragmas tell VB Migration Partner how to migrate given pieces of code without producing errors.
Pragmasは私たちが提案する「convert-test-fixサイクル」のプロセスで働きかけます。変換-検証-修正サイクルは変換しようとする巨大なVB6アプリケーションには必要不可欠です。その作業は、VB.NETアプリケーションとしてリリースされるまで、またはマイグレーション作業が完了するまで維持管理と拡張が必要になります。巨大なアプリケーションとして、実際にVB6とVB.NETバージョンがいつも同期することを保証する最も簡単な方法としては、オリジナルVB6コードをできるだけ多く機能するようにプラグマで注釈を施すようにします。これらのプラグマはVB Migration Partnerがどのように生成するエラーがないようにコードの部分を変換すればよいか、教えます。
A key feature of pragma is that they can be scoped at the project, class, method, and variable level. Project-level pragmas can appear anywhere in the VB6 source code and use the project: prefix. For example, the following pragma tells the code generator to use the Arial 10pt font for all the forms in the current project, unless another FormFont pragma at the form level overrides it:
Pragmaの主要な機能はプロジェクト、クラス、メソッド、変数レベルを捉えられることです。プロジェクトレベルのプラグマはVB6ソースコードのどこにおいても出現し、「project:」を前に付与した形式で使います。例えば、以下のプラグマは現在のプロジェクトの全てのフォームに対し、Arial 10ptのフォントを使うようにコード生成プログラムに指示します。FormFontプラグマがフォームレベルにおいて上書きしない限り。
'## project:FormFont Arial, 10
Pragma arguments are separated by commas; if an argument is a string literal that contains commas, it must be enclosed in double quotes. If an argument contains a command and a double quote character (in a remark, for example), it must be enclosed in double quotes and all double quotes in the original value must be doubled, as you would do if it were a VB literal string.
プラグマの引数はコンマによって分割されます。引数がコンマを含むストリングリテラルの場合、ダブルコーテーションで囲む必要があります。引数にコマンドとダブルコーテーション文字が含まれている場合(例えばコメントなどに)、元のダブルコーテーションの文字列を二重のダブルコーテーションで囲む必要があります。VBでのリテラル文字列についてすることと同様です。
There are a few of exceptions to the above rule, most notably the InsertStatement, ReplaceStatement, Rem, and Note pragmas. These pragmas take just one argument, which is an entire VB.NET statement, and never require that their only argument be enclosed in double quotes, because the comma can’t be misinterpreted as an argument separator.
上記のルールには例外がいくつかあります。特にInsertStatement、ReplaceStatement、Rem、Noteプラグマです。これらのプラグマはただひとつの引数を取ります。全てのVB.NETステートメントにおいて、それらの唯一の引数はダブルコーテーションで囲む必要はありません。コンマは引数区切りとして誤解されることはできないので。
A pragma can be applied to a specific member by prefixing its name with the member name, using the “dot” syntax. For example, the following VB6 code snippet applies the DeclareImplicitVariables pragma to the Test method (this pragma forces VB Migration Partner to generate a Dim statement for each variable that is implicitly declared):
プラグマはドット構文を使って、メンバ名の名前を前に置くことによって、特定のメンバを適用させることができます。例えば、次のVB6コード断片はTestメソッドにDeclareImplicitVariablesプラグマを適用します。(このプラグマは暗黙的に宣言された各変数用にDimステートメントを生成するようにVB Migration Partnerを勧めます。)
'## Test.DeclareImplicitVariables True
…
Sub Test()
…
End Sub
You use the “dot” syntax to refer to specific variables, if the pragma can be applied to a variable. The following code tells the code generator to consider the frm variable as an auto-instancing variable (in this case VB Migration Partner generates code that preserves the As New semantics):
プラグマが変数に適用できるのであれば、具体的な変数を参照するためにドット構文を使用します。次のコードは、frm変数を自動インスタンス変数としてみなすように、コードジェネレータに指示します。(この場合、VB Migration PartnerはAs Newという定義で保持するコードを生成します)
'## frm.AutoNew True
Dim frm As New Form1
If a pragma isn’t prefixed by project: or by a member name, its scope depends on where it appears in the VB6 code. The scoping rules are the same as in VB6: if the pragma appears at the class-, form-, or module-level – that is, it isn’t inside a method – it affects the entire form, module, or class and all its members; if the pragma appears inside a method, then it affects the current method and all its local variables:
もしプラグマが「Project:」またはメンバ名に接頭辞として付けられない場合、その範囲はVB6コードがどこに現れるかによります。そのスコーピングルールはVB6と同じです。もしPragmaがclass-、form-、またはmodule-levelで現れるのであれば、メソッドの内部ではありません。それは、全体のForm、モジュール、またはクラス、そして全てのそのメンバに影響を与えます。もしPragmaがメソッドの内部に現れる場合は、カレントメソッドと全てのそのローカル変数に影響を与えます。
Sub Test()
' this pragma affects all local variables in Test method
'## AutoNew True
…
End Sub
The effect of a pragma can be overridden by a pragma with a narrower scope. For example, you can use a project-level AutoNew pragma that affects all the fields and variables, except those that are affected by AutoNew pragmas at the class, method, or variable level. This hierarchical mechanism adds a lot of flexibility and lets developers precisely define the outcome from VB Migration Partner with few additions to the original VB6 code.
プラグマの効果は狭い範囲でプラグマによって上書きできることです。例えば、クラス、メソッドまたは変数レベルでAutoNewプラグマによって影響を受けるもの以外は、全てのフィールドと変数に現れるプロジェクトレベルのAutoNewプラグマを使うことができます。この階層的メカニズムはたくさんの柔軟性を追加し、開発者がVB Migration Partnerにいくつか追加したものからオリジナルのVB6コードに結果を正確に定義することができます。
VB Migration Partner checks the syntax of all pragmas and doesn’t support pragmas with arbitrary names; however, we provide a one-size-fits-all pragma named SetTag, which developers can use to associate values to code entities. The SetTag pragma is especially useful with extensions.
VB Migration Partnerは全てのプラグマの構文と任意の名前のサポートしないプラグマをチェックします。しかし、SetTagという名前の万能なプラグマを提供しています。開発者はコード自体に値を関連付けさせることができます。SetTagプラグマは拡張性を持ち非常に便利です。
You can easily insert new pragmas by means of a dialog box that explains what each pragma does and what each argument means, and that ensures that the syntax is correct.
ダイアログボックスで新しいプラグマを挿入するのはとても簡単です。それぞれのプラグマと引数の意味を説明し、構文が正しいことを保証します。
In addition to processing pragmas in VB6 source code files, VB Migration Partner looks for the following files:
VB6ソースコードファイルで処理をするプラグマに加えて、VB Migration Partnerは以下のファイルを検索します。
Storing project-level pragmas inside these files is necessary or convenient in two cases. First, you can store project-level PreProcess, ImportTypeLib, and AddLibraryPath pragmas only inside these files. Second, this mechanism allows you to easily share pragma among different projects.
これらのファイルの中にプロジェクトレベルプラグマを保管するのは、次の2つのケースにおいて必要であるか、または便利です。最初に、プロジェクトレベルのPreProcess、ImportTypeLib、AddLibraryPath、をこれらのファイルの内部に保管できます。2つ目にこのメカニズムを異なるプロジェクトの間で簡単にプラグマを共有して使用することができます。
For example, you can ensure that all the form fonts in multiple projects are converted in the same way by creating a file named VBMigrationPartner.pragmas containing this text:
例えば、多重プロジェクトにおける全てのフォームフォントを次のテキストを含んでいるVBMigrationPartner.pragmasというファイル名を作成することにより同じように変換されるということを保証します。
'## FormFont Arial, 10
and then copying it to all the directories that contain the projects you plan to convert. Notice that the project: prefix is optional for pragmas stored in *.pragmas files.
そして、次にプロジェクトを含むすべてのディレクトリにそれをコピーし、変換の計画を行います。プロジェクトに対する注意点:*.pragmasファイルに保存されたプラグマに接頭語「project:」は任意です。
Keep in mind that the “master” pragma file in VB Migration Partner’s main directory (step 1) is always processed, whereas the VBMigrationPartner.pragmas file in the VB6 project’s folder (steps 3) is processed only if the search at step 2 fails. The order in which these files are processed ensures that the settings in files inside the project’s folder can override the settings specified in the “master” pragma file. For example, if both the “master” pragma file and the pragma file in the project’s folder contain an ImportTypeLib pragma that refers to the same type library, the setting specified in the latter file wins.
VB Migration Partnerのメインディレクトリ(Step1)に入っている「マスター」プラグマは常に処理されます。それに対してVB6のプロジェクトフォルダ(Step3)の中にあるVBMigrationPartner.pragmasがStep2の検索に失敗した場合にのみ処理されます。これらのファイルが処理される順番は、プロジェクトのフォルダにある設定ファイルが「マスター」プラグマファイルの特定の設定を優先できることを保証します。例えば、もし「マスター」プラグマファイルとプロジェクトフォルダ内のプラグマファイルの両方が同じタイプのライブラリを参照しているImportTypeLibプラグマを含んでいるのであれば、後者のファイルの特定の設定が優先されます。