...
The VB6 language and the intrinsic VB6 object model provides many types of services to VB6 applications. A few examples are listed here:
...
The first step in customizing how gmStudio rewrites VB6 to .NET is to identify the specific VB6 language elements that provide services to your application and to understand, at a high level, how the services work.
...
In this example, we look at how to customize the replacement of VB6’s Len function.
1) Understand how legacy language elements are used by your application
In VB6, the Len function offers a convenient way to compute the length of a string. Documentation for Len from the VB6 object browser says the following:
Code Block |
---|
Function Len(Expression) |
...
Member of VBA.Strings |
...
Returns string length or bytes required to store a variable
Returns string length or bytes required to store a variable |
gmStudio’s default translation of Len(x) is VBNET.Strings.Len(x). In default gmStudio translation conventions, VBNET is an alias for the Microsoft.VisualBasic namespace. This namespace is distributed in Microsoft.VisualBasic.dll and contains an extensive set of classes that emulate VB6 runtime and VBA.
Decompiling Microsoft.VisualBasic.dll shows that VBNET.Strings.Len is heavily overloaded with separate versions for the .NET |
|
You can use gmStudio’s reporting tools to see how your application uses the Len function. The Source Scan Report can be run from the Search panel or the Reports menu. Simply searching for “Len” will show were you use Len, but may also show some false matches. A more precise Source Scan Report can be done using a more sophisticated regular expression; for example “@\bLen\(“ (the leading @ indicates case-sensitivity). The most precise report for how and where you use Len will be obtained by running the Analytics References Report. See the records in the Analytics References report having MemLibr=Basic, MemClas=Vb6Function, and Memname=Len.
...
The next step in the process is to find the rule for expressing the Len operation and change it. The easiest way to find a rule is to look for the .NET code pattern that you want to change in the metalanguage files. You can do this with the Search Panel in gmStudio. For this example, enter VBNET.Strings.Len in the search box on the left, check the [Lang] checkbox, and click [Run Search]. The results of this search are shown below:
The results show us that the rule for Len is in the VBASIC.xml file, which is located in the gmStudio installation folder, [installdir]\support\trancfg\lang. The actual text of the rule for Len in VBASIC.xml looks like this
...
An additional modification that can be useful when changing a method to a property is to add the status=”postfix” attribute. In this example, status=’postfix’ directs gmStudio to put parentheses around x if needed.
...
Tip |
---|
See Appendix X for instruction on how to modify metalanguage files. |
...
4) Apply and refine those rules for additional source codes as needed
Typically a large, mature code will not meet the assumptions of every migration rule 100% and you should plan to consider alternatives and to refine or extend the rule to deal with variations. This incremental refinement is an important aspect of our iterative methodology.
In this example, the new rule assumes that the type of original argument to Len has a Length property in .NET and that argument is not null at runtime. The first assumption is easy to check using the C# compiler. The second assumption can be checked by static analysis of the code and by runtime testing. We know that the rule will not work for situations where the argument is a struct; in fact the resulting code will not even build. A more appropriate translation of Len(struct), that still avoids using VBNET, is to use System.Runtime.Interop.Marshal.SizeOf().
In this type of situation, a Migration DLL can be used to implement a rule that specifies x.Length is used for strings and Marshal.SizeOf(x) for is used for structs. However, when you encounter exceptions to your coding/upgrade standards, take time to see what the code is actually doing. For example, in the case of code that uses Len with struct you will typically also find Win32 APIs calls or record-based file IO. Both of these things warrant additional redesign as they move to .NET. It may make more sense to rework that section of your code in a different way. Also beware that VB6 language frequently provides high-level services that can only be reproduced by runtime routines that integrate several .NET operations. The check for null in VBNET. Strings.Len is a good example of this.
...
Key Point
Tip |
---|
Balancing manual and automated work is a central tenet of the tool-assisted rewrite methodology. |
...
You should apply rules in a manner that fits the needs of your application and use a variety of techniques including the using gmStudio to systematically integrate hand-written code with the migration solution. |
...
Metalanguage files are XML documents that direct gmStudio as it rewrites your VB6 program for .NET.
...
Tip |
---|
|
...
There are two types of Metalanguage files: default Interface Description Files (IDFs) and default Language Files.
To list and inspect the default Language Files:
...
...
Key Points
...
Tip |
---|
Once a default IDF file exists in your workdspace\usr folder it will take precedence over the default copy. This behavior is governed by gmStudio’s configuration folder search rules: Target before Local before System before Language. |
The [Configuration Files] tab on the Settings dialog is designed to help you inspect and manage all the files that play a role in configuring gmStudio. The following instructions explain how to setup gmStudio to do custom language replacement.
...
The Language Information Script indicates which default language files should be processed to create the language information file. The Project option uses a version of the script that can be edited to specify that your custom language files should be used instead of the default files.
...
Key Points
Tip |
---|
Once you have modified the gmBasic.xml and the VB7Lang.xml files is in your workspace, clicking the [Update Translator Configuration] button will create a new metalanguage information file (VB7Lang.vbi) in your workspace. This customized file will take precedence over the default copy that ships with gmStudio and will be used by the translator instead. of the default copy that ships with gmStudio. |
...
...
...