Doel

Het doel van de masterproef is om een zo generiek mogelijke werkwijze te ontwikkelen om oude Visual C++ 6.0 projecten om te zetten naar Visual C# projecten.

Veel bedrijven werken nog steeds met programma's geschreven in de verouderde programmeertaal Visual C++ 6.0. Omdat de verouderde versie niet meer wordt ondersteund, en zelf ook geen aansluiting toelaat op nieuwere technologieëen, wordt er doorgaans uitgeweken naar Visual C++ 2010 en Visual C#. In deze masterproef wordt eerst het opwaarderen van Visual C++ 6.0 naar Visual C++ 2010 behandeld, daarna het converteren van Visual C++ 2010 naar Visual C#.

Aan de hand van ervaringen opgedaan bij het manueel opwaarderen van vijf proefprojecten werd er gezocht naar een generieke geautomatiseerde methode voor het opwaarderen van (de verschillende versies van) Visual C++ 6.0 naar Visual C++ 2010.

Voor het converteren van Visual C++ 2010 naar Visual C# werden er twee strategieën weerhouden door het opstellen van een proof of concept: enerzijds unmanaged Visual C++ projecten als managed instellen, anderzijds gebruik maken van aanwezige Component Object Model (COM) interfaces. Er werd ook een tool ontwikkeld om de Graphical User Interface (GUI) uit Visual C++ projecten om te zetten naar Visual C# Windows Forms bestanden. Tot slot werd er nagegaan in hoeverre het ontwikkelen van een vertaler van Visual C++ naar Visual C# zou bijdragen aan de oplossing. Hierbij werd de parser generator ANother Tool for Language Recognition (ANTLR) ingezet.

A lot of companies nowadays still work with programs written in outdated programming languages, such as Visual C++ 6.0. Because of the fact that the outdated version is not supported anymore and often does not provide access to more recent technologies, companies usually divert to Visual C++ 2010 and Visual C#. This thesis first treats the process of upgrading from Visual C++ 6.0 to Visual C# and then the conversion from Visual C++ 2010 to Visual C#.

Using the experience gained from the manual upgrade of five test projects, a generic automated method has been sought for the upgrade from Visual C++ 6.0 to Visual C++ 2010 through the different intermediate versions.

For the conversion from Visual C++ 2010 to Visual C#, two strategies have been proved successful through the construction of a proof of concept: The first strategy is to build unmanaged Visual C++ projects as managed, the second strategy is based on using already present Component Object Model (COM) interfaces. A tool has also been developed which extracts the Graphical User Interface (GUI) from Visual C++ projects and converts it to Visual C# Windows Forms.

Finally, it has been examined how the development of a Visual C++ to Visual C# translator would contribute to the conversion process. This involved the use of the parser generator ANother Tool for Language Recognition (ANTLR).

Door wie?

Mijn naam is Martijn Saelens. In 2013 volgde ik de opleiding "master in de industriële wetenschappen: informatica" aan HoGent . Deze opleiding is in de jaren hierna ondergebracht onder Universiteit Gent .

In het kader van deze opleiding was ik bezig aan de masterproef "Migratiestrategieën van C++ naar C#". De masterproef werd opgestart in februari 2012 en beëindigd eind januari 2013. Voor deze masterproef kon ik terecht bij het bedrijf ICORDA NV . Hier werd ik begeleid door dhr. Joris Van Maldeghem en dhr. Tom Eeraerts. Vanuit Hogeschool Gent werd ik begeleid door mevr. Leen brouns.

Ik ben bereikbaar op het emailadres martijn.saelens.p2891@student.hogent.be . Aangezien ik ben afgestudeerd, ben ik niet meer bereikbaar op mijn HoGent-adres. Ik ben wel bereikbaar op martijn.saelens@protonmail.com .

Werkwijze

Het converteren van projecten in Visual C++ 6.0 naar Visual C# 2010 verloopt in verschillende stappen:

I. Converteren van Visual C++ 6.0 naar Visual C++ 2010

Het migreren van een project, gemaakt in Visual Studio 6.0, naar een compileerbaar project in Visual Studio 2010 is niet vanzelfsprekend. De eerste Visual C++ versies in 1998 waren niet compatibel met de C++ standaard. Men besefte bij Microsoft dat dit een grote hinderpaal was. Om Visual C++ te laten voldoen aan de C++ standaard zijn er daarom bij elke nieuwe versie een aantal wijzigingen aan de specificaties van Visual C++ aangebracht. Hierdoor zijn er telkens talloze, subtiele verschillen tussen de verschillende versies van Visual C++ die fouten in bestaande programma's kunnen veroorzaken. Deze fouten worden breaking changes genoemd.

const CHAR_MASK = 0xFF; // VC++ 6.0

const int CHAR_MASK = 0xFF; // VC++ 7.0 of hoger
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
Voorbeeld van een typische conversiefout.

Zo was het bijvoorbeeld in Visual C++ 6.0 nog niet verplicht om een type identifier op te geven indien het ging over een integer. Als de compiler geen type identifier vond, werd ervanuit gegaan dat het om een integer ( int ) ging. In latere versies van Visual C++ wordt dit beschouwd als een syntax error.

Het upgraden van een project naar een hogere versie van Visual C++ bestaat uit drie grote stappen:

1. Visual Studio Conversion Wizard

Het project wordt eerst in de versie van Visual Studio, geassocieerd met de gewenste versie van Visual C++, ingeladen. Visual Studio zal het project automatisch omzetten naar de projectstructuur van de Visual Studio doelversie. Zo zijn de (gegenereerde) projectbestanden compatibel met de gewenste doelversie. Deze aanpassingen hebben enkel invloed op de instellingen en bestandsstructuur van het project, niet op de code zelf.

2. iSE (iSolveEverything)

Hierna wordt het project geopend in iSE. iSE gebruikt de output van de commandline compiler van Visual Studio om fouten te detecteren. Via reguliere expressies analyseert iSE de foutinformatie en koppelt indien mogelijk de juiste oplossing aan de fout. De programmeur controleert de oplossingen aangeboden door iSE en bepaalt welke ervan doorgevoerd moeten worden. Zolang iSE fouten vindt, dient er gehercompileerd te worden met iSE. Bij het hercompileren geraakt de compiler telkens verder en kunnen er nieuwe fouten opduiken.

3. Manueel

Sommige fouten zijn niet programmatorisch op te lossen. Voorbeelden hiervan zijn: interacties met externe libraries, projectspecifieke eigenschappen, link errors, ... Deze fouten moeten manueel opgelost worden, aangezien de code zelf geen fouten bevat. Dit kan niet verwerkt worden met algoritmes, omdat deze fouten een oplossing vereisen waarbij gekeken wordt naar het doel en werking van het project.

II. Het combineren van Visual C++ 2010 en Visual C# deelprojecten via het omzetten van unmanaged naar managed code

Indien het project als managed Visual C++ wordt gecompileerd, dan kan men deelprojecten van verschillende .NET-talen, zoals Visual C++.NET en Visual C#, combineren. Het gebruik van managed Visual C++ heeft zowel voor- als nadelen. Het is ook mogelijk om, via Interop en COM, native Visual C++ en Visual C# projecten met elkaar te laten samenwerken. Op deze manier kan het project deel per deel omgezet worden naar Visual C#, om zo geleidelijk aan het gehele project om te zetten.

III. Converteren van Visual C++ 2010 naar Visual C#

#include <iostream>
int main(int argc, char **argv){
    std::cout << "Hello world!" << std::endl;
    return 0;
}

using System;
namespace HelloWorld
{
    class Hello
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello world!");
        }
    }
}
Voorbeeld van een mogelijke conversie (bovenaan C++, onderaan Visual C#).

Men heeft hier het onderscheid gemaakt tussen GUI en logica. Omdat GUI in Visual C# wordt verwezenlijkt via WPF of Windows Forms kunnen Visual C++ delen met MFC vervangen worden. De logica zelf moet dan nog worden geconverteerd naar Visual C#.

GUI

Hiervoor is de applicatie Rc2Form ontwikkelt. Rc2Form leest de resourcefiles (.rc) van Visual C++ projecten en converteert de daarin aanwezig structuren naar Windows Forms bestanden. Deze bestanden kunnen dan eenvoudig ingevoegd worden in Visual C# projecten.

Logica

De logica bleek zelf niet zo simpel of efficiënt te verwerken. Conversie zou niet een optimaal resultaat genereren. sowieso moet dan de gehele code nagekeken worden. Ook zijn de Visual C++ structuren niet de meest efficiënte structuren als basis voor de automatische conversie. Manueel kunnen er veel efficiëntere en gestructureerde code genereert worden. Deze piste wordt op dit moment niet meer onderzocht.

Uitgebreid voorstel

Het uitgebreid voorstel kan beschouwd worden als een soort contract tussen student en promotor. Met het uitgebreid voorstel legt de student de grote lijnen van de masterproef vast.

Het uitgebreid voorstel behandelt volgende onderdelen;

  • Doelstelling
  • Bestaande situatie
  • Probleemstelling
  • Gedetailleerde omschrijving
  • Op te lossen problemen
  • Aan bod komende technologieën
  • Mogelijke uitbreidingen en opties
  • Vernieuwende aspecten

Download het uitgebreid voorstel (213 KB)

Poster

De poster geeft de masterproef visueel weer.

poster
Download poster (31.14 MB)

Scriptie

De scriptie bevat een compleet verslag van de masterproef.

Download scriptie (2.06 MB)
Download bijlage bij de scriptie (software, ...) (1.14 GB)
Scriptie in de bibliotheek van Hogeschool Gent
Scriptie in de bibliotheek van Universiteit Gent