Languages - DevSource
DevSource: Microsoft Developer Resource DevSource Home Sponsored by Microsoft Home Add Ons Architecture Languages Techniques Using VS Forums
Home arrow Languages arrow Leaving VB6 Behind
Leaving VB6 Behind
By David Jung

Rate This Article: Add This Article To:

You're an experienced Visual Basic programmer. You're considering migrating to Visual Basic .NET. Or should you switch to C#? Here's a good place to start, to get your head screwed on straight.

If all your programming experience has been in VB, VBA, or VBScript, you may feel as though Microsoft left you behind with Visual Studio .NET. In some ways, you're right. Microsoft made a lot of changes to the VB language, to make it work with the .NET Framework. They did this for a very good reason. Rather than trying to hammer all the cool, new things in .NET into the existing VB model, Microsoft rewrote many aspects of the language to make it more modernized. To use a Microsoft phrase, "We wanted to make VB.NET a first class language," which is what—at least in my opinion—they did.

However, they had to change the way some things worked within the language. Much of the core syntax is still there, but the different way objects and errors are handled can confuse many VB-only developers.

ADVERTISEMENT

I won't enumerate all the things that changed; there's already a really good MSDN article that covers this: Ten Code Conversions for VBA, Visual Basic .NET, and C#.

For something more detailed but light-weight (if that's really possible), there's a really great book published by O'Reilly called C# & VB.NET Conversion Pocket Reference. This $14.95 (SRP) pocket reference book has 139 pages of incredibly useful information on the difference between C# and VB.NET. It'll show how you would code the same task in both languages, with a brief explanation of each code block, pointing out "gotchas" to look out for, how the object-orientation programming models differ between the languages, and identifying unique features that are in one language but missing in the other.

Upgrading Your VB6 App to .NET

After the first release of Visual Studio .NET 2002, Microsoft was flooded with complaints and comments from the VB community that the transition from VB to VB.NET was difficult, despite what Microsoft's user acceptance testing showed.

In response, they created a VB6 add-in that will scan your VB project's source code and make suggestions on the best coding practices to make your transition to VB.NET easier. It's based on the VB Project upgrade wizard that comes with Visual Studio .NET.

If you haven't used the project upgrade wizard before, you're not missing much. What it does is try to convert all known VB syntax to VB.NET syntax where it possibly can. That includes things like converting Variant data types to Object data types, Integer data types to Int data types, attempting to switch any intrinsic controls with .NET intrinsic controls, and so on. What its not going to do is ensure your VB6 code will work with VB.NET. The wizard can't correct a lot of things, so it makes recommendations in the form of "To Do's" and "UPGRADE_WARNING" messages.

How do you run the wizard? From within Visual Studio .NET IDE, just open up a VB6 project and the wizard will fire up. Voila! It's just that simple. Some really simple projects convert just fine. However, watch out for the dreaded "Microsoft.VisualBasic.Compatibility" and "Microsoft.VisualBasic.Compatibility.Data" namespaces (or references) it may insert into your newly converted project. These libraries allow you to make VB6 method calls that were taken out of the VB.NET language. This is Microsoft's way to ensure some compatibility with legacy VB code.

Just like when it came time to upgrade Windows 16-bit application to be a 32-bit application, Microsoft tried to make it easy by offering a thunking layer that allowed developers to make 16-bit system calls from within their 32-bit environment. These compatibility references offer something similar. However, rather than clogging up your code with a mix between VB and VB.NET, you should ask yourself if you really need to upgrade the application to .NET.

If you answer "yes," then you'd better start doing some system planning and application rearchitecting. Don't just convert your application and building on whatever foundation you're currently on. You're better off reevaluating your application to work with the features that .NET has to offer.

Useful references:

Thinking in .NET

You might have heard that all programs generated in .NET execute the Common Language Runtime (CLR). Prior to .NET, all programs would run against their own runtime library. C++ used MSVCRTxx.DLLs, and VB used the MSVBVM60.DLL. Now, all .NET orograms, regardless of which language they were written in, use the .NET Framework's CLR as it source library to execute against.

When going from VB to .NET, probably the biggest change you have to make is thinking in an object-oriented manner. You can't code in VB.NET or C# without thinking this way. You have to think about things like constructors/destructors, inheritance, overloading, polymorphism, and so on.

Figure 1.

If you find yourself struggling with some of the differences between how things were done in VB6 and how it's suppose to be in VB.NET, the IDE has a tool called "Upgrade Visual Basic 6 Code" found under the Tools menu. What you do is enter in a VB6 code snippet and it will do its best to translate it to VB.NET syntax. You can also select COM objects (see Figure 1) and it will create the necessary entries in your applications reference section (see Figure 2).

Figure 2.

Unfortunately, this tool cannot be found in Visual Studio .NET 2002. Microsoft included it in Visual Studio .NET 2003, and it only works with VB6 code to VB.NET. Remember, not all the VB code you enter in will translate into VB.NET code. The following example is a simple procedure to a lot of VBers used to center a form when it loads:

Me.Move ((Screen.Width - Me.Width) / 2), ((Screen.Height - Me.Height) / 2)

This is the translation from the Upgrade Visual Basic 6 Code tool:

'UPGRADE_WARNING: Couldn't resolve default property of object Me.Height.
 Click for more: 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup1037"'
'UPGRADE_WARNING: Couldn't resolve default property of object Me.Width.
 Click for more: 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup1037"'
'UPGRADE_WARNING: Couldn't resolve default property of object Me.Move.
 Click for more: 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup1037"'
Me.Move((VB6.PixelsToTwipsX _
    (System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width) _
    - Me.Width) / 2, (VB6.PixelsToTwipsY _
    (System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height) _
    - Me.Height) / 2)

The correct VB.NET syntax is the following:

Me.SetBounds((System.Windows.Forms.Screen.GetBounds(Me).Width / 2) - (Me.Width / 2), _
    (System.Windows.Forms.Screen.GetBounds(Me).Height / 2) - (Me.Height / 2), _
    Me.Width, Me.Height, System.Windows.Forms.BoundsSpecified.Location)

And, in case you wanted to know how it would look in C#:

this.SetBounds((Screen.GetBounds(this).Width/2) - (this.Width/2),
    (Screen.GetBounds(this).Height/2) - (this.Height/2),
    this.Width, this.Height, BoundsSpecified.Location);

If you're trying to go from VB6 to C#, you're going to have to find that information elsewhere. Luckily, a number of savvy Web sites offer help in this area. Some offer free code translator online and some offer version that can be used offline. These are just a few:

  • C# to VB.NET Translator: An online system that converts your C# code to VB.NET
  • KamalPatel.NET: A Microsoft MVP who has an online and offline C# to VB.NET converter
  • Ellkay.Com: A software development group in NJ (that Kamal Patel works at) that has an online VB.NET to C# converter

If you perform an Internet search using engines like Google or Yahoo, just enter "vb to c#"and you'll be amazed on how many tutorials and conversion tools there are to assist you.

What's Best for You?

There are a number of debates in the Microsoft developer community as what is the right language to migrate to: VB.NET, C#, or a mixture? The reality is, both are viable languages, and the decision really depends on your organizational needs. If your background is VB, then jumping into VB.NET will take some getting used to, but the you will find it a much richer environment to develop applications.

Going from VB to C# is a bit more tricky. C# is more like C++ and Java, in that you use brackets and semicolons, and the code is case sensitive. However, despite what Microsoft wants you to think, C# offers you more features like pointers, shift operators, inline documentation, and overloaded operators. Also, similar to C++, creating custom controls in C# is easier to do than in VB.NET.

I've personally have written the same application in both VB.NET and C#. When I've done so, I found that some C# features made the programming experience much easier than trying to figure out how to force VB.NET to try to do the same thing. VB.NET is still one of the best tools for rapid application development; C# isn't that far behind. My expectation is that, probably by the next release of Visual Studio .NET, they will be neck and neck.

Discuss this article in DevSource's new forum!




Discuss Leaving VB6 Behind
 
>>> Be the FIRST to comment on this article!
 

 
 
>>> More Languages Articles          >>> More By David Jung
 



Microsoft's Future: A Chat With Their CTO, Barry Briggs

Play Video >

All Videos >

Julia explores the Robotics Studio!

Read now >

Messages to Bill Gates!

Read now >

View Now
DevSource RSS FEEDS
XML Want an easy way to keep up with breaking tech news? And the Get DevSource headlines delivered to your desktop with RSS.