VB Migration Partner

Migration tools: Feature Comparison Table

For over six years, developers wishing to migrate their VB6 to .NET could only choose between two tools:

  1. Microsoft Upgrade Wizard (free, included in Visual Studio)
  2. Artinsoft VB Upgrade Companion

In spite of their different names and features, these two tools have a lot in common, in that they share the same conversion engine and the same approach to code migration. In 2008 Code Architects made the choice wider by launching an innovative VB conversion software:

  1. VB Migration Partner

Competition is always a good thing because it drives innovation, and customers are those who benefit most from it. With more choices, however, VB6 developers now face the difficult task of selecting the right product for their needs.


Feature Comparison Table

To make such a decision easier, this document summarizes and compares the features of Microsoft Upgrade Wizard 2008 (UW), Artinsoft’s VB Upgrade Companion Enterprise Edition (VBUC), and Code Architects’ VB Migration Partner (VBMP).

We are aware that preparing a feature comparison is a very delicate matter, even if we tried to be as objective as possible. We support our descriptions by means of links to online documentation when such documentation is available. At the bottom of the table we even describe a few features that are available only in our competitor’s product, a kind of bona fide that you don’t see often in marketing literature.

The Benefits column explains why a given feature can be important in migration scenarios:

C: the feature reduces or avoids compilation errors.
R: the feature avoids runtime errors and preserves functional equivalence.
M: the feature generates code that is more readable and concise, abides by .NET programming guidelines, and makes maintenance easier.
O: the feature generates optimized and faster .NET code.
T: the feature can reduce overall migration time and cost, for example it eliminates the need to prepare the VB6 app for the migration. Features that reduce learning and support costs also fall in this category.

NOTE
Fully supported features are marked with signed, features that are only partially supported with signedP.

UPDATE (September 25, 2011): Artinsoft has recently released VBUC 5.0. We have updated this document accordingly.

Feature
Benefits
UW
VBUC
VBMP
Notes
General
Generates both VB.NET and C#
CT
 
signed
signed
Starting with version 1.50, VBMP supports both VB.NET and C# code generation. See below about the differences in how VBUC and VBMP generate C# code.
Conversion of VB6 project groups
CT
 
signed
signed
VBMP can convert VB6 projects groups in a fully automated way. VBUC performs a separation between the pre-processing and conversion stages and a certain amount of manual labor may be necessary when migrating VB6 project groups.
Automated batch migrations
T
 
signed
signed
The command-line version of VBMP can be integrated in build scripts and batch files to automated complex project migrations.
Super-fast parsing/code generation
T
   
signed
VBMP runs at least 5x faster than UW, even if it delivers VB.NET code with about 10-15x fewer compile and runtime errors. VBUC uses that same conversion engine on which UW is based.
Granular control over code generation
CRT
 
signedP
signed
VBUC Enterprise Edition uses customized profiles to enable conversion features at the project level only (Profiles aren’t allowed in VBUC Develop Edition). VBMP pragmas allow you a higher degree of granularity in that they can have global, project, file, method, and variable scope.
Support library
CROT
 
signedP
signed
VBMP’s supports library ensures that converted VB.NET preserves full functional equivalence with the original VB6 code. VBUC comes with a limited set of helper classes and methods. VBMP support library has many other advantages, too.
Integrated code editor
T
   
signed
VBMP is a stand-alone software that contains a VB6 and VB.NET code editor with syntax highlighting, search capabilities, and support for inserting pragmas in source code without using the VB6 IDE.
Pre- and post-processing features
CR
 
 
signed
VBMP can use regular expressions to pre-process VB6 code or post-process the generated VB.NET or C# code (PreProcess and PostProcess pragmas), can add or remove source files (AddSourceFile and ExcludeCurrentFile pragmas), can exclude or include portions of VB6 code during parsing or during code generation (ParseMode and OutputMode pragmas), and a lot more.
Repeated conversion of VB6 apps that evolve during the migration process
T
   
signed
VBMP’s convert-test-fix methodology allows to keep the VB6 and .NET apps in sync during the entire migration and modernization initiative. Other conversion tools work on a snapshot of the VB6 code, further changes in VB6 code must be manually applied to the VB.NET code. VBUC uses a merge mechanism named continuous migration that should permit to preserve portions of VB.NET or C# code from being overwritten, yet it fails if the original VB6 code for those portions has changed.
Interoperability with VB6 apps and staged migration scenarios
T
   
signed
VBMP generates VB.NET (but not C#) components that are binary-compatible with the original VB6 component, so that existing COM clients can reference the new .NET DLL without having to be recompiled (see BinaryCompatibility pragma). Read this article for more information about the importance of binary compatibility in migration scenarios. VBUC supports COM visibility, not backward compatibility at the binary level.
Partial conversions of individual source files (incremental migrations)
CT
   
signed
The SetOption RemarksMethodBody pragma allows you to migrate a portion of the entire VB6 project. For example, you can migrate individual forms, classes, and modules, and even individual methods. This feature allows you to focus on a subset of the project so that you can keep the compilation and runtime errors to the minimum and have a running .NET project in less time.
Support for source control tools
T
   
signed
When re-migrating a given VB6 project or group, VBMP ensures that the re-generated project is recognized by source code control tools.
Full control over migration warnings
T
   
signed
VBMP allows you to control the amount of migration warnings, by disabling or enabling specific migration messages (DisableMessage and EnableMessage pragmas) as well as entire categories of messages, e.g. all messages related to code analysis (DisableMessages and EnableMessages pragmas). You decide whether these pragmas affect the entire project, a single file, a given method or variable.
Extendibility for customization purposes
CRT
 
signedP
signed
VBMP offers several extendibility mechanisms, ranging from simple hooks during the migration process to the ability to generate custom code for 3rd-party ActiveX controls. Some VBUC extensions must be written using Kablok, a proprietary programming language by Artinsoft.
Unlimited duration for user license
T
signed
 
signed
VBUC’s user license has a limited duration (3 months for the Developer Edition, 1 year for the Enterprise Edition).
Support for Windows 7 and 64-bit version of Windows
T
 
signed
signed
Both VBMP and VBUC can be installed under all recent versions of Windows.
Language
Arrays with nonzero lower bound
CR
 
signedP
signed
VBMP offers several pragmas that allow you to precisely indicate how such arrays are handled. (See ArrayBounds and ShiftIndexes pragmas.) VBUC attempts to detect the best way to convert these arrays, but isn’t able to generate the best code in all circumstances.
Assignments between arrays
R
signedP
signed
signed
UW uses the Array.Clone method to preserve VB6 semantics when assign an array to another array. VBMP goes one step further in that it can perform deep array copying and can correctly deal with arrays containing nested objects.
Erase keyword
R
signedP
signedP
signed
The behavior of the VB6 Erase keyword depends on whether the array is static or dynamic. (A static array is declared and instantiated in a single Dim statement, whereas a dynamic array is instantiated in a separate ReDim statement.) VBMP accounts for this difference, whereas both UW and VBUC always deal with arrays as if they were dynamic.
Array rank inference
CR
 
signed?
signed
VBMP is able to infer the correct number of dimensions of an array in virtually all cases, a feature that UW apparently lacks.
Fixed-length strings
CR
signedP
signedP
signed
VBMP supports fixed-strings and arrays thereof, including correctly passing them to Windows API and writing them to binary files.
Operators and expressions with Variants
R
   
signed
UW always converts Variants into Object variables. VBMP optionally converts Variants into the VB6Variant special type that preserves VB6/COM behavior, for example in how math and string operators are evaluated
Null propagation in expressions
R
   
signed
VBMP can generate code that preserves the propagation of Null values in expression (see NullSupport pragma).
Gosub, On Goto, On Gosub keywords
C
   
signed
VBMP supports these keywords and is also capable, where possible, to refactor Gosubs into calls to separate methods (see ConvertGosubs).
Structures assignment and initialization
CR
   
signed
VBMP automatically initializes Structures and arrays of Structures even if the Structure contains arrays, fixed-length strings, As New objects, or nested structures. It also takes care of performing a deep copy when a structure is assigned to another structure variable.
Binary file I/O (Get#, Put# keywords)
R
signedP
signedP
signed
UW uses FileGet and FilePut VB.NET methods, which don’t work well if the structure contains arrays, fixed-length strings, or nested structures; VBMP uses custom helper methods that don’t suffer from these issues.
As New variables with true auto-instancing semantics
R
   
signed
VBMP can enforce true auto-instancing semantics for variables, fields, local variables, and UDT items (see AutoNew pragma).
As New keyword used with arrays
R
   
signed
VBMP preserves functional equivalence also when As New is used in array declarations. (Read here for more details.)
ByRef ParamArray method parameters
R
   
signed
.NET only supports by-value ParamArray parameters. VBMP preserve functional equivalence also when a method modifies an element in a ParamArray parameter (see FixParamArray pragma).
As Any parameters in Declare methods
C
 
signed
signed
VBMP gets rid of the Any keyword by generating one or more overloads for the Declare method. VBUC generates a separate project that contains these overloads.
AddressOf keyword in calls to Declare methods
CR
 
signedP
signed
VBMP generates a Delegate type and an overload for the Declare method. Just as important, VBMP is able to generate code that avoids subtle bugs caused by orphaned delegates passed to Windows API (see WrapDeclareWithCallbacks pragma). VBUC generates a separate project that contains these overloads, but don’t fix the problem with orphaned delegates.
VarPtr, StrPtr, ObjPtr undocumented functions
C
   
signedP
VBMP maps these keywords to methods that throw an exception; this approach is useful to avoid compilation errors. In addition, VBMP offers limited support for the VarPtr keyword when used on local variables and structures.
Byte-oriented string functions
CR
   
signedP
VBMP offers replacement methods that behave exactly like the original LeftB, MidB, AscB, etc. functions in most cases.
Behavior differences in VB functions
R
   
signed
The following VB.NET keywords and functions don’t work exactly like the VB6 original functions: Abs, AppActivate, CStr, Dir, DoEvents, FileAttr, FileDateTime, CDate, IsDate, InputBox, Mod, MsgBox, Str, TypeName, TypeOf. VBMP offers replacement methods that preserve functional equivalence, both when generating VB.NET and C# code.
VB6 language objects (e.g. App, Screen)
CR
signedP
signed
signed
VBMP supports all the VB6 language objects – App, Clipboard, Screen, Printer, Printers, Forms, etc - and guarantees functional equivalence with original VB6 code, except for a few members that have no equivalence in .NET (e.g. OleServerBusy property).
Printing
CR
signedP
signedP
signed
VBMP supports all print-related features, including Print and Print Setup common dialogs that communicate with the Printer object by means of its hDC property. UW supports printing by means of the Printer object in VB Power Packs, which lacks these features. Optionally, VBMP allows you to use the Printer object included in MS VB PowerPacks, which is how VBUC implements this functionality.
Fully compatibility with VB6 enums
RT
   
signed
All enumerated properties in VBMP support library use the same enum values as in VB6; this detail ensures that assignments to these properties always work as intended even if the enum value is an integer read from a file, the registry, or returned by a method in the same project or in an external COM component, in both early-bound and late-bound scenarios. (Useful in phased migration scenarios.)
Full control over project-level settings
T
   
signed
VBMP permits to control the project-level settings of the .NET application being generated. For example you can change the default output path, the Option Explicit setting, whether a .pdb file has to be generated, and so forth. (Read here for more information.)
Built-in debugging features
M
   
signed
VBMP support library includes a few debugging and tracing features, such as the ability to dump the call stack when a fatal error occurs in the .NET application. (Useful to remotely diagnose malfunctioning.)
Ignore fatal runtime error
M
   
signed
.NET applications generated by VBMP can optionally ignore fatal runtime errors, by simply setting the VB6Config.LogFatalError property to True. This feature is quite useful during the test and debug phase of a migrated project.
Language (C# specific)
Convert ByRef parameters into by-value parameters if possible
RMO
 
signed
signed
Both VBUC and VBMP analyze the way each by-reference parameter is used inside the method and transform it into a by-value parameter if possible. (This feature is crucial because it simplifies all calls to the method.)
Generate “out” parameters if possible
MO
 
 
signed
If the CSharpOption UseOut pragma is used, VBMP analyzes the way each method parameter is used and used the out keyword if possible.
Generate methods overloads to get rid of “ref” and “out” parameters
CMO
 
 
signed
VBMP can optionally generate method overloads that don’t contain any “ref” or “out” parameter. (This feature is crucial because it simplifies all calls to the method.) For more info, see CSharpOption OverloadsForByval pragma.
Optional parameters
CMO
 
signedP
signed
VBMP can optionally generate method overloads that don’t contain any “ref” or “out” parameter. (This feature is crucial because it simplifies all calls to the method.) For more info, see CSharpOption OverloadsForByval pragma.
“ref” and “out” optional parameters
CMO
 
signedP
signed
C# doesn’t support optional parameters that require by-reference semantics. VBMP converts these parameters into ref/out nonoptional parameters; VBUC often fails to correctly handle this case.
Date constants
CRMO
 
 
signed
C# doesn’t natively support DataTime constants. VBMP converts these constants into static readonly fields, whereas VBUC leaves them as-is and generate compilation errors.
Late-bound calls with helper methods
CR
 
signed
signed
Both VBUC and VBMP can handle late-bound calls by generating calls to helper methods in the support library.
Late-bound calls with “dynamic” variables
CRMO
 
 
signed
VBMP leverages C# 2010 dynamic variables to handle late-bound calls, when the UseDynamic pragma is used; VBUC doesn’t use this important new C# feature and can only handle late-bound calls by generating bloated and inefficient code that uses helper methods.
Properties with parameters
CM
 
signed
signed
Both VBUC and VBMP convert properties with parameters into either indexer methods (if it’s the default property) or into a pair of get/set methods.
Properties with distinct Let/Set accessors
CRM
 
 
signed
VBMP can optionally generate a separate setobj_propname method, if the original VB6 property exposed both Property Let and Property Set accessors (see the PreservePropertyAssignmentKind pragma.)
WithEvents variables
CRM
 
signed
signed
Both VBUC and VBMP convert WithEvents variables into properties whose set accessor correctly registers/unregisters event handlers.
Implicit interface implementation
C
 
signed
signed
Both VBUC and VBMP convert VB6 methods that implement an interface member into a public C# method with same name.
Explicit interface implementation
C
 
 
signed
Only VBMP can optionally convert VB6 methods that implement an interface member into a private C# method that adopts the interfacename.methodname syntax. (For more info, see the CSharpOption ExplicitInterfaceImplementation pragma.) This feature can avoid name collisions and keeps the class’s object model tidier.
On Error Goto statement
CRM
 
signedP
signedP
Both VBUC and VBMP convert On Error Goto statements into a try-catch block; however, in both cases the resulting C# might not be fully functional equivalent to the original VB6 code (in this case VBMP emits a warning).
On Error Resume Next statement
CRM
 
signedP
signedP
Both VBUC and VBMP can convert statements under the scope of a On Error Resume Next statement by generating lambda expressions (see CSharpOption ConvertOnErrorResumeNext pragma for more info.) However, only VBMP allows you to precisely indicate then classes or methods when this replacements must be done (VBUC only supports a project-level setting) and only VBMP works correctly with statements that use ref/out parameters (which can’t appear inside lambda methods).
The Err object
CRM
 
signedP
signed
VBMP uses the helper object VB6Helpers.Err to perfectly replicate the behavior of the original VB6 Err object.
C# strict typing
CR
 
signedP
signed
Both VBUC and VBMP correctly generate the C# code that coerces/converts values between different data types. However, if necessary VBMP uses helper methods to ensure that values are handled using the VB6 conversion rules, whereas VBUC always use C# keywords and can therefore introduce subtle bugs.
Integer and Long VB6 variables
CRM
 
signedP
signed
To reduce the amount of conversion code to be emitted, VBUC handles all VB6 Integer (16-bit) variables as if they were Long (32-bit) variables, but this approach can create subtle bugs, for example when writing to a file or when an On Error statement is expected to fire in case of overflow. By default, VBMP converts VB6 Integer type into C# short type, but can handle them as 32-bit values if so desired.
Bitwise vs. logical And/Or operators
RM
 
signed
signed
Both VBUC and VBMP correctly convert And/Or operators into the most appropriate C# keyword, depending on whether the operator is used for a bitwise (& and |) or logical (&& or ||) operation.
Option Compare Text directive
RM
 
 
signed
Only VBMP accounts for the Option Compare Text directive and correctly generates string comparison code that works in case-insensitive way.
Math vs. string “+” operator between Variants
RM
 
signedP
signed
Both VBUC and VBMP use heuristic rules to determine whether a “+” operation between Variant values is actually a sum or a string concatenation. However, only VBMP provides a pragma (CSharpOption AssumeConcatenation) that allows you to override the default behavior if necessary.
Math vs. string comparison between Variants
RM
 
signedP
signed
Both VBUC and VBMP use heuristic rules to determine whether a comparison between Variant values is actually a numeric or string comparison. However, only VBMP provides a pragma (CSharpOption AssumeStringComparison) that allows you to override the default behavior if necessary.
Select Case
CRM
 
signedP
signed
VBUC always converts a Select Case block into a if…elseif block. VBMP always attempts to generate a C# switch block if possible, because the C# compiler can optimize this code better; if it isn’t possible, then VBMP reverts to an if…elseif block.
Select Case with a test expression
RMO
 
signedP
signed
When a Select Case block tests an expression, VBUC generates an if…elseif block that repeatedly re-evaluates the expression, and therefore the resulting code is inefficient and potentially prone to bugs (e.g. if the expression affects global variables). In these cases VBMP correctly evaluates the expression only once and stores the result in a temporary variable.
For Each variables passed to ref/out parameters
C
 
 
signed
C# prevents passing the controlling variable of a foreach loop to a ref/out parameter in a method call. VBMP avoids this error by generating an alias to be used as the controlling variable. (In same circumstances, VBUC generates a compilation error.)
Exit For/Do/While in nested loops
R
 
 
signed
VBUC always converts Exit For/Do/While statements into the C# break keyword, but this approach introduces bugs in some cases. In these cases, VBMP generates the correct C# code that properly exits the loop.
With… End With blocks
CRM
 
signed
signed
Both VBUC and VBMP convert With… End With blocks by generating – if necessary -a temporary variable that holds the With expression.
ByVal string parameters with byref semantics in Declare
R
 
signedP
signed
Both VBUC and VBMP can correctly translate the most common Windows API methods that take a ByVal string value with by-reference semantics, e.g. GetWindowText. However, only VBMP allows you to extend this mechanism to any Declare statement.
Expressions in #If and #Const directives
CRM
 
signedP
signed
C# doesn’t support expressions in #define and #undef directives, however both VBUC and VBMP correctly determine which portions of code are conditionally converted. However, only VBMP generates derivate #define directives that make the code more readable and maintainable.
Optimization of class field initialization
RMO
 
 
signed
Only VBMP analyzes the code inside Class_Initialize and correctly initializes class-level fields.
Using native .NET methods
MO
 
signedP
signed
Both VBUC and VBMP can optionally generate calls to native .NET methods rather than helper methods defined inside the support library. However, VBUC sometime generates code that isn’t functional equivalent to the original VB6 code, whereas VBMP only performs “safe” replacements (see UseNetMethods pragma).
Collection object
CRMO
 
signedP
signed
VBUC converts references to the Collection object into .NET native classes (e.g. HashTable or List), which aren’t fully equivalent to the VB6 object. VBMP converts these references to the special Collection6 helper class, that guarantees functional equivalence.
Classes and Components
Resolution of default property in late-bound scenarios
R
 
signed
signed
UW can derive default property names (e.g. Text1 => Text1.Text) only for strongly-typed variables. VBMP can correctly resolve default properties even for Object variables in late-bound contexts (see DefaultMemberSupport pragma).
CreateObject method
R
signedP
signedP
signed
VBMP uses a helper method that can instantiate both COM and .NET objects. UW uses the VB.NET CreateObject method, that only works with COM objects. (This feature is especially useful in staged migration scenarios.)
Correct release of COM objects
RMO
 
signed
signed
Both VBUC and VBMP use a Try-Finally block to correctly release references to COM objects (e.g. ADODB.Recordset objects).
Deterministic finalization for IDisposable objects
RMO
 
signedP
signed
VBMP can generate the cleanup code for all IDisposable objects – both those defined in current project or those defined in an external library, e.g. database connections and file handles (see AutoDispose pragma). VBUC doesn’t correctly release objects referenced by class fields.
Property Get/Let/Set procedures
C
signedP
signedP
signed
VBMP correctly handles a number of cases that UW leaves unresolved, for example properties with both Get/Let/Set blocks with different value type or different default values for Optional parameters. (See also PreservePropertyAssignmentKind pragma.)
Classes with Class_Terminate method
RMO
signedP
signedP
signed
VBMP creates a class that implements the IDisposable interface and generates the recommended Dispose-Finalize code pattern . UW generates only the Finalize method.
Class member description
M
 
signedP
signed
When translating a class property or method, VBMP generates both the <Description> attribute and the XML remark for that member.
Advanced features in UserControl classes
CR
   
signed
VBMP can handle most advanced UserControl features, such as KeyPreview property, Ambient and Extender objects, data-bound members, OLE_OPTEXCLUSIVE properties, properties that are readonly at design-time, properties with nonstandard serialization, and more.
Sub Main in DLL projects
R
   
signed
Under VB6, the Sub Main method is guaranteed to run before any class in the DLL is instantiated. VBMP generates code that preserves functional equivalence in this case.
MTS/COM+ components
CR
signedP
signed
signed
VBMP is able to deal with advanced MTS/COM+ features, such as support for IObjectContext and IObjectConstruct interfaces and the SecurityProperty objects.
Multi-threaded components
RT
   
signed
VBMP generates code that accounts for differences between the Single-Thread Apartment model used in VB6 and the .NET threding model, which can cause subtle and random errors at runtime (see ThreadSafe pragma)
Persistable COM classes
C
   
signed
VBMP generates classes marked with <Serializable> attribute, correctly converts InitProperties, ReadProperties, and WriteProperties event handlers, and supports the PropertyBag argument passed to this handlers.
ADO data-source and data consumer classes
C
   
signed
VBMP correctly translates VB6 classes that work as ADO data source and data consumer classes; only simple binding is supported.
ADODB support
O
 
signedP
signed
VBUC can convert DAO, RDO, and ADO code into references to ADO.NET objects, but omits to support keysets/dynamic server-side cursors. Most ADODB features are supported only partially. Code Architects’ ADOLibrary offers complete support for ADO.NET with nearly 100% coverage of ADODB features, including support for server-side SQL Server cursors (read more here)
Additional COM type libraries converted to .NET objects
CR
 
signed
signed
VBMP converts the following COM objects into native .NET objects: StdDataFormat, BindingCollection, Dictionary, FileSystemObject, RegExp. Please contact Artinsoft for the complete list of COM components converted by VBUC.
Forms and Controls
Built-in VB6 controls
C
signed
signed
signed
VBMP supports all the 60+ controls in the VB6 toolbox, except OLE Container and DataRepeater. VBUC also supports these controls, however it generates additional extender controls to better support command, listbox, combobox, listview and SSTab controls.
Microsoft ActiveX controls found in VB6 toolbox
CR
signed
signed
signed
All the controls in VBMP support library inherit from a standard .NET control. Thanks to inheritance rule and the special NetObject property, it is always possible to access the full power of the underlying .NET control. (Read here for some examples.)
3rd-party ActiveX control support
CR
signedP
signedP
signedP
UW migrates commercial ActiveX controls but don’t convert them to .NET controls. VBUC uses library extensibility to convert a subset of the features of a few 3rd-party controls by mapping them to intrinsic or commercial .NET controls, typically with 50 to 80% coverage of control features. VBMP uses a separate tool (AxWrapperGen) to generate the wrapper class for a given ActiveX control; developers can then use the wrapper class as-is or edit it to map properties and members to an intrinsic or commercial .NET control.
Full access to all features of the .NET control
MO
signed
signed
signed
All the controls in VBMP support library inherit from a standard .NET control. Thanks to inheritance rule and the special NetObject property, it is always possible to access the full power of the underlying .NET control. (Read here for some examples.)
Functional equivalence of controls’ properties, methods, events
CR
 
signedP
signed
Only an extensive support library can guarantee that all properties, methods, and events behave exactly like the original VB6 code.
Late-bound references to controls’ members
R
   
signed
Controls in VBMP’s support library expose properties and methods with same name as the original members, which ensures that code runs correctly even in late-bound scenarios.
Controls.Add method
CR
   
signed
VBMP fully supports the Controls.Add method for dynamically creating controls at runtime; it works with both built-in controls and ActiveX controls and fully supports the VBControlExtender object for handling late-bound events.
DAO, RDO, ADO data-binding
CRT
signedP
signedP
signed
VBMP supports virtually all forms of data-binding, including binding to DataEnvironments, ADO data source and consumer classes, UserControls that work as ADO data sources, StdDataFormat objects, and more.
“classic” (VB3-style) drag-and-drop
CRT
   
signed
Starting with version 1.10.01, VBMP fully supports “classic” drag-and-drop (e.g. the DragMode property and the DragDrop event).
OLE Drag-and-drop
CRT
   
signed
VBMP fully supports OLE Drag-and-drop, in both automatic and manual modes. All properties, methods, and events are correctly translated.
Drop-down menus
CR
signedP
signedP
signed
VBMP fully supports arrays of menu items and the ability to transform a menu item into a separator (or vice versa) by assigning its Caption property.
Popup (context) menus
CR
   
signed
VBMP supports context menus and the Popup method, including the ability to display the menu at current mouse position or at specified coordinates.
Graphic properties and methods
CRT
 
signedP
signed
VBMP supports all VB6 graphic methods and properties – Cls, Line, Circle, PSet, PaintPicture, DrawWidth, FillColor, FillStyle, etc.- with the only exception of the DrawMode and ClipControls properties. VBUC has a limited support only for Cls, Print, Line, Circle, and PaintPicture methods (no boxed lines, no fill color, etc.)
AutoRedraw property
R
   
signed
VBMP supports double buffering by means of AutoRedraw property; as in VB6, no Paint event fires if this property is True. The VB6 Image property is also supported.
User-defined scale coordinates
CRT
   
signed
VBMP supports all VB6 coordinate systems, including user-defined ScaleMode settings and negative values for ScaleWidth/ScaleHeight properties. All scale-related properties can be assigned at runtime.
Font mapping customization
R
   
signed
The FormFont, ReplaceFont, and ReplaceFontSize pragmas enable VBMP users to specify how original font and control fonts should be rendered in .NET.
Controls collection includes nested controls
R
 
signedP
signed
VBMP forms expose a Controls collection that also includes controls nested in other controls, as it happens in VB6 and unlike what .NET does. VBUC uses a helper class to achieve this feature, but it doesn’t work well in all cases.
Dynamic Data Exchange (DDE) properties, methods, and events
CR
   
signedP
VBMP supports DDE communications between two forms of the same application or two (or more) migrated .NET applications. It doesn’t support DDE communications with non-VB6 DDE servers (e.g. Microsoft Excel).
Help-related properties and methods
CR
 
signedP
signed
VBMP supports all help-related properties and methods and can reuse existing help files in HLP and CHM format. VBUC only supports the CHM format.
TreeView, ListView, Toolbar, TabStrip, and StatusBar object models
CR
 
signedP
signed
Controls in VBMP support library exactly replicate the object model of the original VB6 controls, which guarantees that functional equivalence is fully preserved. VBUC doesn’t achieve 100% compatibility.
UpDown, Animation, FlatScrollBar controls translated to .NET native controls
RM
   
signed
According to Artinsoft online docs, these controls aren't converted to native .NET controls and appear in converted .NET projects as ActiveX controls.
Microsoft Windowless control library (MSWLESS)
RM
 
signedP
signed
According to VBUC online documentation, only the WLText, WLCombo, and WLCheck controls are converted into native .NET controls. Conversely, VBMP correctly converts all the controls in this library (WLText, WLCommand, WLOption, WLCheck, WLList, WLCombo, WLHScroll, WLVScroll, and WLFrame).
Label and Image controls used as hotspots
R
   
signed
VBMP supports transparent “hot spots” for detecting mouse activity – i.e. Label and Image controls with transparent background that still receive mouse-related events. Hot spots are typically used to implement buttons with irregular shapes or image maps. VB.NET doesn’t natively support this feature.
 
O
 
 
signed
Starting with v.1.34, VBMP supports a special .NET flag that dramatically reduces flickering when loading forms with hundreds of controls.
Support for window subclassing
CRMO
   
signed
VBMP provides the special VB6WindowSubclasser helper class , which makes it easy to convert VB6 code that uses window subclassing.
ADODB support
Database-agnostic
CRM
 
signed
signed
VBUC provides support for multiple database types by means of ADO.NET interfaces and base classes (e.g. DbConnection, DbDataReader) and selecting the right ADO.NET provider by means of a proper factory method. VBMP reaches the same goal using concrete classes (e.g. ADOConnection, ADORecordset) which expose an enum property that specifies which ADO.NET data provider should be used.
Forward-only read-only cursors
RO
 
signed
signed
Both VBUC and VBMP convert these ADODB cursors into DataReader ADO.NET objects
Client-side static cursors with batch updates
RO
 
signed
signed
Both VBUC and VBMP convert these ADODB cursors into DataTable/DataSet ADO.NET objects
Server-side keyset and dynamic cursors
CRO
 
 
signed
VBMP supports these cursors only for Microsoft SQL Server
Stand-alone client-side recordsets
CR
 
signedP
signed
VBMP supports all the features of ADODB recordsets that aren’t linked to a database.
Parameterized commands
CRM
 
 
signed
VBMP supports the standard ADODB syntax for parameterized commands, using either ? or @param for value placeholders.
Stored procedure calls with input, output, and return parameters
CRM
 
signedP
signed
VBMP fully supports calls to SQL Server stored procedures, including special support for output parameters and return values.
Dynamic properties of Connection and Recordset objects
RM
 
 
signedP
Most dynamic properties of the Recordset objects are supported and honored, including Update Criteria, Unique Table, Resync Command, and Update Resync.
Connection and Recordset events
CRM
 
 
signed
VBMP supports all the events of the Connection and Recordset objects, which fire in the same order and with same parameters as the ADODB library.
Asynchronous connections
RM
 
 
signed
VBMP fully supports asynchronous connections, no need to manually fix the migrated source code.
Asynchronous commands
RM
 
 
signed
VBMP fully supports asynchronous commands, no need to manually fix the migrated source code.
Optimistic batch updates
CRM
 
signedP
signedP
Both VBUC and VBMP aren’t able to support all the features of the UpdateBatch ADODB command, yet the list of VBMP limitations is considerably shorter. Please read ADOLibrary documentation for more details.
Custom batch update strategies
RM
 
 
signed
VBMP honors the “Update Criteria” dynamic property of the Recordset object.
Full access to all ADO.NET features
OT
 
signed
signed
Both VBUC and VBMP allows you to use and manipulate “native” ADO.NET structures such as the DataTable or the DataReader.
Filter property
RM
 
 
signed
VBMP includes a parser that “understands” the syntax used for the Recordset.Filter property.
Support for .NET bound controls
MO
 
signedP
signed
Data-bound controls work correctly after the migration, however VBUC doesn’t fire all the usual events that are typically used in data-binding scenarios (eg. WillMove, MoveCompleted), therefore the migrated code doesn’t work like the original VB6 code.
Helper library
CRMO
 
signed
signed
Both VBUC and VBMP use a set of helper classes to offer support for ADODB-to-ADO.NET migration, the main difference being that VBMP’s library is patterned after the ADODB object model and is therefore easier to learn and use.
Code Analysis and Refactoring
Conversion of On Error into Try-Catch
MO
 
signed
signed
VBMP converts both On Error Goto and On Error Resume Next into Try-Catch blocks, if functional equivalence can be fully preserved (see UseTryCatch pragma).
Nested IFs merging
M
 
signed
signed
VBMP can converted two or more nested IF blocks into a single IF that uses short-circuiting and the AndAlso operator (see MergeIfs pragma).
Type inference
RMO
 
signed
signed
VBMP infers the type of Variant fields, variables, and parameters so that a strong-type member can be generated and its default property can be correctly deducted (see InferType pragma).
Unreachable code and unused members detection
M
 
signed
signed
VBMP emits a warning for unreachable code – e.g. code that follows Goto or Exit Sub keywords – and unused fields, methods, Consts, and Declares. It is also possible to mark as “referenced” members that are accessed via late-binding or from an external project (see MarkAsReferenced and MarkPublicAsReferenced pragmas), a feature that is missing in VBUC.
Unreachable code and unused members removal
M
 
signed
signed
VBMP can remove or remark out unreachable code or unused members (see RemoveUnreachableCode and RemoveUnusedMembers pragmas). VBUC’s apparently lacks the ability to specify which public classes and methods are used by other apps, a detail that makes this feature less useful in migrating ActiveX DLLs.
Renaming engine for guideline compliance
M
 
signed
signed
VBMP supports both declarative and imperative renaming rules. Declarative rules are described in an XML file that can be edited to match our own coding style; imperative rules can be written using VB.NET or C# (see ApplyRenameRules pragma). VBUC uses a set of rename rules which can be modified only by writing new rules in Artinsoft’s Kablok proprietary language.
Refactoring of Gosub into separate method
MO
   
signed
VBMP can translate Gosubs into calls to separate private methods in most cases (see ConvertGosubs pragma).
Conversion of ByRef into ByVal
MO
 
signed
signed
VBMP detects parameters that are marked with implicit or explicit ByRef but aren’t assigned inside the method, and optionally converts them into ByVal parameters. This refactoring technique delivers faster VB.NET code and avoids a category of runtime errors (see UseByVal pragma). VBUC doesn’t support this feature when converting to .NET.
Obsolete or dangerous Windows API calls
RM
   
signed
VBMP automatically replaces a Windows API call with the most appropriate .NET native method in some cases. If the replacement isn’t possible, VBMP suggests which .NET object or method can effectively replace the call. (Over 300 API Declares are handled in this way.)
Unnecessary Class_Finalize event handlers
MO
   
signed
If VBMP detects that a Class_Terminate handler contains only cleanup code for fields that would be disposed of anyway, then no Finalize method is generated, which in turn speeds up class instantiation and destruction.
Exit Function and Exit Property keywords
M
 
signed
signed
VBMP converts Exit Function and Exit Property into Return keywords, if possible.
Missing variable declarations
M
 
signed
signed
VBMP allows you to control whether it should generate Dim statements for all local variables that weren’t explicitly declared (see DeclareImplicitVariables pragma).
Variable and field initializers
M
 
signed
signed
VBMP can merge the declaration of a class field or a local variable with the first assignment to that field/variable, e.g. Dim x As Integer = 1 (see MergeInitialization pragma).
Compound assignment operators (e.g. x += 1)
MO
 
signed
signed
VBMP automatically generates compound assignment operators for math operations and string concatenations.
Generate Properties from fields
M
   
signed
VBMP can replace fields with Property procedures and generate better structured .NET code (see AutoProperty pragma) .
If… Then… Else simplification
M
   
signed
VBMP checks whether the Then and Else blocks of an IF statement contains the same code, in which case the IF block is dropped. (These IFs are often the result of the migration of similar Property Let/Set procedures.)
Optimized Boolean operations
MO
   
signed
The PostProcess pragma allows you to optimize most common Boolean expressions, Read here for several examples of this technique.
Missing “As” keyword warning
M
   
signed
VBMP emits a warning when translating a field, variable, function, or parameter that lacks the “As” keyword into a Variant member, thus giving the developer a chance to fix the problem in the original VB6 code or by means of a SetType pragma.
Conversion of TypeName into “Is” keyword inside tests
MO
 
signed
signed
VBUC can optionally convert a statement such as If TypeName(obj) = “Widget” into the more efficient If TypeOf obj Is Widget. VBMP can reach the same result by means of the PostProcess pragma and gives you other options, e.g. the ability to convert to the more precise If obj.GetType() Is GetType(Widget).
Auto-implemented properties (VB 2010)
MO
   
signed
Thanks to the PostProcess pragma, VBMP users can refactor standard property procedures into auto-implemented properties. (Read here for more details.)
Unused type libraries
M
   
signed
VBMP emits a warning if a VB6 project references one or more type libraries that are never actually used and suggests to remove the reference from the original code (or from the converted .NET code, using an appropriate PostProcess pragma).
Slow string concatenations
O
   
signed
VBMP emits a warning when a string concatenation operation occurs inside a loop and suggests to replace the string with a super-efficient StringBuilder6 object. A single SetType pragma is then sufficient to enable the replacement, no other manual code edits are required. This technique can speed up the .NET code by two or three orders of magnitudes (as explained in this article).
String concatenations with Text property
O
   
signed
VBMP automatically generates calls to AppendText methods in lieu of concatenations of Text property (e.g. Text1.Text = Text1.Text & “*”) in TextBox, ComboBox, and RichTextBox controls, a refactoring technique that speeds up the VB.NET code by a factor of 100x or more.
Inefficient collections
O
 
signedP
signed
VBMP can replace the standard VB.NET Collection object and the Scripting.Dictionary object with faster VB6Collection and VB6Dictionary .NET objects, without losing functional equivalence. VBUC can convert a Collection into a .NET ArrayList or HashTable, but this replacement can’t be performed in all cases.
Long namespaces
M
 
signed
signed
VBMP automatically shortens objects namespace if a suitable project-level or file-level Imports statement has been enforced (see AddImports pragma).
Reporting
Pre-migration, multi-project assessment report
T
 
signedP
signed
Use VB6 Bulk Analyzer tool to generate detailed metrics of your multi-project VB6 application, then send this report to Code Architects’ support team to receive a detailed pre-migration assessment report, with tips on using VBMP effectively, links to relevant docs and KB articles, etc. (Similar to Code Advisor and Assessment Tool, except these tools only work on a single VB6 project or project group at the time.)
Post-migration warning report
T
signedP
signedP
signed
VBMP generates a separate HTML document that explains of all the warnings emitted in the converted project, tips to work around most common issues, etc. At the end of the migration process VBUC doesn’t provide direct links to specific pages in the documentation.
Code metrics
T
   
signed
VBMP generates detailed code metrics for the code being converted, including code size, complexity (cyclomatic index), loop nest level, etc. Code metrics can be generated at the solution, project, and file level.
Multi-project reports in batch mode
T
   
signed
VBMP can generate consolidated reports when running in batch mode over a set of distinct projects, a feature which is crucial when migrating large N-tier apps. The report can include code metrics and/or the result of compilation. Being generated as an XML file, it can be easily processed and transformed into other formats by means of XSLT.
Estimation of migration time/cost
T
   
signed
VBMP can generate a detailed Microsoft Excel report that summarizes all migration issues and attempts to predict the time and cost required to obtain a working .NET application. The report accounts for different skills and expertise levels (e.g. junior and senior developers, testers, architects) and is fully customizable. (Similar yet more flexible than Assessment Tool.)
Support
Full documentation available online
T
 
signedP
signed
Prospecting customers can browse VBMP manual before purchasing the product. In May 2009 Artinosft has launched a new website meant to offer full documentation for their VBUC tool, however a lot of information is still not available.
Extensive Knowledge Base archives
T
   
signed
VBMP users can rely on our Knowledge Base, updated almost daily with how-to articles and troubleshooting tips, and the most detailed list of differences between VB6 and VB.NET languages available on the Internet.
VB6 and .NET project samples
T
   
signed
Developers can run and test open source VB6 projects and see how VBMP converts them, before they purchase our software. Artinsoft doesn’t provide any complete example of a real-world VB6 project that is correctly converted by VBUC without any pre- or post-migration manual labor.
Subscription period and free upgrades
T
   
signed
During the subscription period VBMP users can download new versions of the migration tool at no additional fee.
Free tech support via email
T
 
?
signed
Tech support during the subscription period is included in VBMP end-user agreement, no additional fee is required. Read what users have to say about our tech support.
Royalty-free support library
T
 
signed
signed
Both VBUC and VBMP come with a royalty-free support library that is required by all converted .NET applications.
Lifetime free upgrades for the support library
T
   
signed
Users of VBMP version 1.xx have a lifetime right to download any future versions of the 1.xx support library, including bug fixes, speed optimization, support for additional controls, and more.
Bug fixing in deployed .NET apps
T
   
signed
If a bug in the .NET application depends on the support library, the VBMP team will promptly fix it and provide a new build of the library, which can then be deployed to existing users and customers. No remigration or recompilation is needed.
Support library source code
M
 
signed
signed
Please contact Code Architects for details on licensing VBMP library’s source code.
For the sake of objectivity...
Refactoring of API calls into a separate class
M
 
signed
  VBUC 4.0 can move all Declare statements to a separate class. More info here.
WebClasses
CR
signedP
signedP
  Both UW and VBUC support WebClass components by means of a combination of generated .NET code and helper classes. VBMP doesn’t support WebClass apps because we strongly believe that they should be rewritten as ASP.NET for best performance and ease of maintenance.
Conversion from ASP to ASP.NET
M
 
signedP
  VBUC supports conversion of a subset of ASP features to ASP.NET. For more details read here.


Migration warnings and issues

Another way to compare VB6 migration tools is to check the list of migration warnings that they emit. We have carefully scrutinized all VBUC’s Errors, Warnings and Issues (EWIs), using its online documentation. It’s worth noticing that, seven years after VBUC inception, this documentation hasn’t been completed yet and many EWIs are still not documented. You can find the result of our analysis in this table.

Here’s a quick recap of our findings:

  • VBUC can emit 57 different EWI messages, related to VB6 features that it fails to migrate correctly.
  • VBMP supports a much wider range of VB6 features, and in fact emits only 4 messages related to unsupported features, plus 3 messages related to features that are supported only partially

VBMP generates 10-12x fewer warnings than VBUC on the average, thus you can expect a proportional increase in productivity in real-world migration projects (and a proportional decrease of migration costs).

Each EWI from VBUC contains the URL of a web page that explains the problem and how to fix it. (In theory at least, because a few URLs lead you to a blank page…). In addition to getting information on individual warnings, VBMP users can quickly obtain a report that recaps all the warnings in the generated code *and* the recommendations for each of them. It’s a minor detail that saves you precious minutes and immediately provides an overview of the overall effort and expertise that are necessary to successfully complete the migration.



What the feature table doesn’t tell

1. Designed specifically for VB6-to-.NET conversions

VBMP was created with just one goal in mind: converting VB6 projects into VB.NET as easily and accurately as possible, and was later extended to generate optimized C# code. The conversione engine is written in highly optimized, object-oriented VB.NET and can be extended using any .NET language. Thanks to these features, VBMP runs about 5 times faster than UW and delivers VB.NET code with 10-15x fewer compilation and runtime errors.

UW and VBUC share the same language-agnostic conversion engine (codenamed Freedom™) used in other Artinsoft's conversion tools for Java and C#. A few VBUC features can be customized only by means of conversion rules written in a proprietary programming language named Kablok.


2. Product-oriented vs. service-based approach

Code Architects is committed to produce a VB conversion software. Even if we do offer migration services, most of our revenues come from product sales. Tech support for VB Migration Partner is free (subject to the conditions of its EULA), customers have to bear no additional or unplanned costs. The fact that we don’t make money from support means that we put all our efforts into a software that requires a very limited degree of tech support.

Our competitors have a mixed approach to migration: they offer both a tool and migration services and consulting. Interestingly, available case studies show that on-site consulting and mentoring is nearly always necessary to complete most migration projects above a few hundred thousand lines of code (LOCs).

By comparison, our customers routinely port VB6 applications several millions lines of code, just using the retail VBMP edition and standard tech support from Code Architects.

We strongly believe that Code Architect’s approach keeps total migration cost and time as low as possible and make VB6-to-.NET migrations affordable to companies of any size and for projects of any complexity. The very fact our tech support is included in purchase price guarantees that our main concern is to relentlessly improve our product and making it as easy-to-use, powerful, and robust as possible. No need to hire external .NET experts or consulting companies.


3. Easy troubleshooting, reactive tech support decreases overall costs

VBMP manual and the entire Knowledge Base is available online. Developers can learn about features and limitations of our product before they purchase it. No pre-sale hype, no post-sale apologies, just mere facts.

The entire documentation is searchable. Developers involved in the migration project can often solve their doubts in few seconds and without contacting Code Architects support. If they really need assistance, however, our tech support team is just one email away. The people who reply to your enquires are often the same guys who authored the software and our customers can attest that you won’t wait long for the solution to your enquiry.


4. Extensive support library provides functional equivalence

All VB6 conversions software available on the market somewhat rely on a support library to reduce the number of compilation and runtime errors. VBMP library is undoubtedly the most extensive of the group, an important detail to ensure that functional equivalence with the original VB6 code is preserved and to dramatically minimize overall migration time and cost.

Also, consider that the library supports VB6 features that would be very difficult to implement in the .NET application using a conventional migration tool. For example, VB Migration Partner supports both “classic” and OLE drag-and-drop and eliminates the need to manually convert any D&D-related code to .NET. Same consideration applies to graphic methods and the “double-buffering” feature offered by the AutoRedraw property. VB Migration Partner even supports DDE-related properties, methods, and events, which means that you don’t have to redesign your application to implement a proprietary form of inter-process communication – perhaps based on .NET remoting or Windows Communication Fundation. These features alone can save you a huge amount of time and can keep the total cost of migration as low as possible.

Interestingly, our competitors are improving their support library at each new version, a clear evidence that the support library is the best approach you can use in migration scenarios. Regardless of their change of attitude, however, only VBMP provides a support library that can really take care of all the VB6 features that don’t have a direct .NET counterpart.

VBMP library has many other important advantages, including a few non-obvious ones. Read about them in our 17 Reasons for using a support library in migration scenarios white paper.


5. Support for evolving VB6 applications

VBMP is the only VB conversion software on the market with support for the innovative convert-test-fix methodology. In a nutshell, you fix any conversion problem by inserting migration pragmas in the VB6 code rather than editing the converted VB.NET code. This technique allows you to keep the VB6 and .NET versions in synch until the migration to .NET is complete, regardless of whether the migration takes days, weeks, or months. Convert-test-fix is an essential feature for companies and ISVs that need to frequently update or improve the VB6 code in the meantime.

By comparison, all other migration tools on the market work on a “snapshot” of the VB6 code base. If the VB6 code has to be modified afterwards, the edits have to be manually propagated to the .NET code. Such a manual procedure takes time and is error prone, a problem that VB Migration Partner customers can safely ignore. In an implicit recognition of the importance of this feature, 7 years after the first release of their VBUC flagship product, Artinsoft introduced a new mechanism named “continuous migration”, which attempts to address this need (in a very partial way).

Also, VBMP is the only VB migration software that fully supports staged migrations of large N-tier apps, i.e. the ability to convert an individual VB6 component without breaking the binary compatibility or having to recompile existing COM clients. This important feature allows you to focus on the portions of the applications that urgently require a rewrite to .NET and postpone the conversion of less critical components. The ability to use existing UI clients to test the converted .NET DLLs dramatically simplifies the debug and QA phases.


6. A reliable team – and Microsoft acknowledges it

VBMP is the joined effort of a group of internationally well-known industry experts, including three authors of top-selling VB books and two Microsoft Regional Directors. (Microsoft Corp. has designated only about 140 RDs world-wide, chosen among the most authoritative independent .NET experts)

Both Code Architects and Artinsoft are recognized Microsoft Visual Studio Partners and take part to the VSIP program.



Conclusions

Selecting the right migration software for your VB6 application isn’t a simple task. A feature comparison table is a good starting point, yet you should consider how important a given feature is important in your specific scenario.

Also, you should always keep in mind that the total cost of a migration initiative includes many items, that might not be immediately apparent. For example, a support library can dramatically reduce the time and cost for the debug, test, and QA phases. And the ability to supported incremental (staged) migrations and the convert-test-fix methodology can be indispensable to deliver your .NET software earlier while keeping it always in sync with the original VB6 application.

For more information on how VB Migration Partner can help you convert your VB6 code to .NET faster, just contact us.